GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (225 стр.)

Сообщения на форуме пользователя Andrey (225 стр.)

Протестируйте пожалуйста плагин для 3D Studio Max 6.09 мар. 200515:57#3
Ну скажите что-нибудь ведь уже 14 скачиваний :(
Проблема с отображением материалов при загрузке уровня из двоичного формата + плагин экспорта для 3D Studio Max 6.09 мар. 200515:31#7
StepanTar
короче вот код полный:
//Получение локальной матрицы трансформации
			Matrix3 tm = node -> GetObjTMAfterWSM(i -> GetTime());
			//Против часовой стрелке если положительный масштаб
			if (TMNegParity(tm)) {
				//обход обратный
				reverse = true;
				vx1 = 2;
				vx2 = 1;
				vx3 = 0;
			} else {//По часовой стерке если отрицательный масштаб
				vx1 = 0;
				vx2 = 1;
				vx3 = 2;
			}
			//Массив задающий порядок обхода
			int orderPass[] = { vx1, vx2, vx3 };
				//Маcив граней
			Face* face = NULL;
			//Для Вершин
			Point3 v;
			//Для Текстурных координат
			Point3 tvert;
			//Нормаль к гране
			Point3 normal;
			//Индекс вершины
			int index = 0;
			//Проход по списку граней
			for (int j = 0; j < nTriangles; j ++) {
				//индекс материала
				MatId = mesh -> getFaceMtlIndex(j) % numMtl;
				//Вывод в файл
				outLog << "Индекс материала: <" << MatId << ">" << endl;
				out.write(&MatId, sizeof(char));
				//Вывод номера полигона
				outLog << "Полигон <" << j << ">" << endl;
				//Проход по 3 вершинам грани
				for (int k = 0; k < 3; k++) {
					//Получение грани
					face = &mesh -> faces[j];
					//Получение индекса вершины
					index = face -> v[orderPass[k]];
					Point3 vec;
					vec.x = vec.y = vec.z = 0;
					//обнулить 4 столбец чтобы не учитывалось смещение
					tm.SetRow(3, vec);
					//Получение 1 вершины
					v = tm * mesh -> verts[index];
					//Вывод в файл
					outLog << v << "," << endl;
					Write(out, v);
					//Получение индекса вершины
					//index = face -> getVert(k);
					//Получение указателя на класс RVertex
					RVertex *rVert = &mesh -> getRVert(index);
					//Получение нормали
					if (GetVertexNormal(mesh, j, rVert, normal)) {
						//Нормализация
						normal.Normalize();
						//Вывод нормали
						Write(out, normal);
						outLog << normal << "," << endl;
					} else {
						//ошибка экспорта
						ok = false;
						ErrorMessage("Отсутствует нормали");
						return;
					}
					//вывод в файл текстурных координат
					if (nTextureVertex) {
						//Получение коодинаты
						tvert = mesh -> tVerts[index];
						out.write((char *)&tvert.x, sizeof(float));
						out.write((char *)&tvert.y, sizeof(float));
						outLog << "<" << tvert.x << " , " << tvert.y  << ">" << endl;
					}
				}
			}
Протестируйте пожалуйста плагин для 3D Studio Max 6.09 мар. 200512:08#2
Ну пожалуйста попробуйте экспортнуть кубик с материалами и все :)
Проблема с отображением материалов при загрузке уровня из двоичного формата + плагин экспорта для 3D Studio Max 6.09 мар. 200511:53#5
StepanTar
вот так:
//Получение локальной матрицы трансформации
			Matrix3 tm = node -> GetObjTMAfterWSM(i -> GetTime());
			//Против часовой стрелке если положительный масштаб
			if (TMNegParity(tm)) {
				//обход обратный
				reverse = true;
				vx1 = 2;
				vx2 = 1;
				vx3 = 0;
			} else {//По часовой стерке если отрицательный масштаб
				vx1 = 0;
				vx2 = 1;
				vx3 = 2;
			}
			//Массив задающий порядок обхода
			int orderPass[] = { vx1, vx2, vx3 };
				//Маcив граней
			Face* face = NULL;
			//Для Вершин
			Point3 v;
			//Для Текстурных координат
			Point3 tvert;
...
			//Индекс вершины
			int index = 0;
			//Проход по списку граней
			for (int j = 0; j < nTriangles; j ++) {
...				//Проход по 3 вершинам грани

				for (int k = 0; k < 3; k++) {
					//Получение грани
					face = &mesh -> faces[j];
//Получение индекса вершины
					index = face -> v[orderPass[k]];
//...Экспорт вершин
		//Получение индекса вершины
...
					index = face -> getVert(k);
...
					//вывод в файл текстурных координат
					if (nTextureVertex) {
						//Получение коодинаты
						tvert = mesh -> tVerts[index];
						out.write((char *)&tvert.x, sizeof(float));
						out.write((char *)&tvert.y, sizeof(float));
						outLog << "<" << tvert.x << " , " << tvert.y  << ">" << endl;
					}
				}

Правка: 9 мар. 2005 11:55

Протестируйте пожалуйста плагин для 3D Studio Max 6.09 мар. 200510:50#1
Проблема в том что говорили что работает не правильно, т.е. двоичный файл размером 0 байт
Протестируйте пожалуйста плагин для 3D Studio Max 6.09 мар. 200510:29#0
Привет всем прошу протестировать плагин вот ссылка:
http://www.gamedev.ru/download/?id=1907

Интересует его работа в общем.
Сапсибо всем заранее, с уважением Андрей.

Как спользовать OpenGL в QNX?9 мар. 200510:19#21
Жаботыкин
>Да ваще хитрый препод: хочет получать зарплату за то что его же студент учил бы его компутерной графике :)
понимаешь наша кафедра типа "Программное обеспечение и т.д..." сформировалось недавно совсем не из "Программистов",там пару преподов владеют серьезно программированием...остальные бывшие инженеры...
так что вот так :)
преподу это интересно поэотому сказал чтобы мне показал...
Проблема с отображением материалов при загрузке уровня из двоичного формата + плагин экспорта для 3D Studio Max 6.05 мар. 200517:02#2
Загрузчик првильно грузит всю геометрию, имена тексту(если таковые есть)
вот код отрисовки mesh'а:
...
Vector3D normal;
		int i;
		Vector4D v;
		int Id;
		int k;
		//число полигонов
		int Number = mesh.GetNumFaces();
		//проход по граням
		for (i = 0; i < Number; i ++)  {
			//если есть материалы
			if (mesh.MaterialsIsOk()) {
				//получить индекс материала
				Id = mesh.GetVertice(i).MatId;
				//если индекс другой
				if (k != Id) {
					//запомнить его
					k = Id;
					//отражение
					float shininess;
					//индекс текстуры
					unsigned int TextId = mesh.GetTextureBumpId(Id);
					//если индекс корректный
					if (int(TextId) > 0)
glBindTexture(GL_TEXTURE_2D, TextId);
					//получить спекулярный цвет материала
					v = mesh.GetSpecular(Id);
					//Спекулярная состовляющая материала
					glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &v[0]);
					//получить диффузионный цвет материала
					v = mesh.GetDiffuse(Id);									//Диффузионная состовляющая материала
					glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, &v[0]);
					//Получить Фоновый цвет для материала
					v = mesh.GetAmbient(Id);
					//модель освещения
					glLightModelfv(GL_LIGHT_MODEL_AMBIENT, &v[0]);
					//Фоновая состовляющая материала
					glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, &v[0]);
					//получить отражение
					shininess = mesh.GetShininess(Id);
					//Отраженная состовляющая материала
					glMaterialfv(GL_FRONT, GL_SHININESS, &shininess);
				}
			}
//отображение полигона
			glBegin(GL_TRIANGLES);
//текстурная координата
				glTexCoord2fv(&mesh.GetVertice(i).tvert[0][0]);
//вершина 0
				glNormal3fv(&mesh.GetVertice(i).normal[0][0]);
//текстурная координата
				glVertex3fv(&mesh.GetVertice(i).vert[0][0]);
				glTexCoord2fv(&mesh.GetVertice(i).tvert[1][0]);
//нормаль
				glNormal3fv(&mesh.GetVertice(i).normal[1][0]);
//вершина 1
				glVertex3fv(&mesh.GetVertice(i).vert[1][0]);
//текстурная координата
				glTexCoord2fv(&mesh.GetVertice(i).tvert[2][0]);
//нормаль
				glNormal3fv(&mesh.GetVertice(i).normal[2][0]);
//вершина 2
				glVertex3fv(&mesh.GetVertice(i).vert[2][0]);
//текстурная координата

				glTexCoord2fv(&mesh.GetVertice(i).tvert[2][0]);

			glEnd();
...
		}
		glDisable(GL_TEXTURE_2D);
...
то текстуры отображаются но отображаются совсем неправильно
вот как это выглядет:
Изображение удалено
что я делаю не так?
заранее всем спасибо.
Прошу не киртиковать формат экспорта, и загрузчик, в этом деле я начинаюший.
Спасибо всем заранее.
С уважением Андрей.

Правка: 9 мар. 2005 10:13

Проблема с отображением материалов при загрузке уровня из двоичного формата + плагин экспорта для 3D Studio Max 6.05 мар. 200517:02#1
[/code]
также написал загрузчик этого формата.
первая версия класса Mesh вот такого содержания:
//Класс мешь
class Mesh {
public:
	//класс материала
	class Material {
	private:
		//Амбиент свойство
		Vector4D Ambient;
		//Diffuse свойство
		Vector4D Diffuse;
		//Specular свойство
		Vector4D Specular;
		//текстура Diffuse
		unsigned int TextureDiffuseId;
		//текстура Bump
		unsigned int TextureBumpId;
		//отражение
		float shininess;
	public:
		//возврат самоосвешение
		float GetShininess() const
		{
			return shininess;
		}
		//установка самоосвешение
		void  SetShininess(float Shininess)
		{
			shininess = Shininess;
		}
		//возврат specular свойства
		const Vector4D& GetDiffuse() const
		{
			return Diffuse;
		}
		//установка ambient свойства
		void SetAmbient(const Vector4D& ambient)
		{
			Ambient = ambient;
		}
		//установка diffuse свойства
		void SetDiffuse(const Vector4D& diffuse)
		{
			Diffuse = diffuse;
		}
		//установка specular свойства
		void SetSpecular(const Vector4D& specular)
		{
			Specular = specular;
		}
		//возврат specular свойства
		const Vector4D& GetSpecular() const
		{
			return Specular;
		}
		//возврат ambient свойства
		const Vector4D& GetAmbient() const
		{
			return Ambient;
		}
		//установка индекса diffuse текстуры
		void SetTextureDiffuseId(unsigned int Id)
		{
			TextureDiffuseId = Id;
		}
		//установка индекса bump текстуры
		void SetTextureBumpId(unsigned int Id)
		{
			TextureBumpId = Id;
		}
		//возврат индекса Diffuse текстуры
		unsigned int GetTextureDiffuseId() const
		{
			return TextureDiffuseId;
		}
		//возврат Bump текстуры
		unsigned int GetTextureBumpId() const
		{
			return TextureBumpId;
		}
		Material() : TextureDiffuseId(-1), TextureBumpId(-1), shininess(128.0f) {};
		~Material() {};
	};
	//Грань
	class Vertice {
	public:
		//индекс материала
		char MatId;
		//Вершины
		Vector3D vert[3];
		//Нормали
		Vector3D normal[3];
		//Текстурные координаты
		Vector2D tvert[3];
	};
private:
	//имя модели
	string name;
	//массив материалов
	vector<Material> materials;
	//Массив граней
	vector<Vertice> vertices;
public:
	//присутвие материалов
	bool MaterialsIsOk() const
	{
		return !materials.empty();
	}
	//возвратить отражение
	float GetShininess(int MatId)
	{
		return materials[MatId].GetShininess();
	}
	//индекс диффузионной текстуры
	unsigned int GetTextureDiffuseId(int MatId) const
	{
		return materials[MatId].GetTextureDiffuseId();
	}
	//индекс bump текстуры
	unsigned int GetTextureBumpId(int MatId) const
	{
		return materials[MatId].GetTextureBumpId();
	}
	const Vector4D& GetAmbient(int MatId) const
	{
		return materials[MatId].GetAmbient();
	}
	const Vector4D& GetDiffuse(int MatId) const
	{
		return materials[MatId].GetDiffuse();
	}
	const Vector4D& GetSpecular(int MatId) const
	{
		return materials[MatId].GetSpecular();
	}
	//установка имени модели
	void SetName(const string& Name)
	{
		name = Name;
	}
	//имя модели
	const string& GetName() const
	{
		return name;
	}
	int GetNumFaces() const
	{
		return vertices.size();
	}
	//добавление вершины
	void AddVertice(const Vertice& vertice)
	{
		vertices.push_back(vertice);
	}
	//добавление метериала
	void AddMaterial(const Material& material)
	{
		materials.push_back(material);
	}

	//возврат материала
	const vector<Material>& GetMaterials() const
	{
		return materials;
	}
	//возврат материала
	Material& GetMaterial(int index)
	{
		return materials[index];
	}
	//возврат грани
	Vertice& GetVertice(int index)
	{
		return vertices[index];
	}
	Mesh() {};
	~Mesh(){};
};
Проблема с отображением материалов при загрузке уровня из двоичного формата + плагин экспорта для 3D Studio Max 6.05 мар. 200517:01#0
Привет всем!
написал экспорт плагин в свой двоичный формат.
формат файла простой:
char  0bh //версия файла экспорта
string model_name;
char количество текстур в объекте
//компоненты материала
float, float, float, float texture_ambient;
float, float, float, float texture_diffuse;
string diffuse_map_filename;
float, float, float, float texture_specular;
string bump_map_filename;
float, float, float, float texture_emission;
float texture_	shinines
//геометрия
int количество полигонов в объекте
char polygon_material_ID; //номер материала в файле экспорта
 float, float, float vertex_position;//координаты вершины
 float, float, float vertex_normal;//координат нормали к вершине
 float, float vertex_diffuse_UV; //текстурные координаты
вот так выглядет код загрузки
материалов:
//материал
...
Mtl *mat = node -> GetMtl();
...
//Число материалов
int numMtl = mat -> NumSubMtls();
//далее вывод числа материалов в файл
...
//Экспорт материала
ExportMaterial(node);
....

//Экспорт материала из узла
void ModelSaver::ExportMaterial(INode* node)
{
//Получить материал из узла
Mtl *mat = node -> GetMtl();
...
//стандартный материал
StdMat *material = NULL;
//Число материалов
int numMtl = mat -> NumSubMtls();
//Проверяем стандартный ли это материал.
if (mat -> ClassID() != Class_ID(DMTL_CLASS_ID, 0)) {
        for (int i = 0; i < numMtl; i++)
          //получить i - материал
          material = (StdMat*) mat-> GetSubMtl(i);
         //экспортировать его
         ExportMat(material);
      }
   else {
       material = (StdMat*) mat;
      //экспортировать его
      ExportMat(material);
  }
}

//экспорт материалов
void ModelSaver::ExportMat(StdMat* material)
{
//Проверка наличия поля diffusemap
if (!material -> MapEnabled(ID_DI)) {
	ErrorMessage("Отсутствует поле diffusemap");
	return;
}
//Проверка наличия поля bumpmap
if (!material -> MapEnabled(ID_BU))
	outLog << "Отсутствует поле bumpmap" << endl;
     //Вспомогательная переменная
     TimeValue timeValue = i -> GetTime();
    //Фоновая освещенность
      Color Ambient = material -> GetAmbient(timeValue);
     //Вывод в файл
     outLog << "Текстура Ambient: ";
    OutColor(outLog, Ambient, 1.0f);
     outLog << endl;
    Write(out, Ambient, 1.0f);
    //Диффузионная освещенность
    Color Diffuse = material -> GetDiffuse(timeValue);
   //Вывод в файл
   outLog << "Текстура Diffuse: ";
   OutColor(outLog, Diffuse, 1.0f);
   outLog << endl;
    Write(out, Diffuse, 1.0f);
...
    //Получить имя диффузионной текстуры
   TexturePatch = GetNameTexture(material, ID_DI);
....
  //Вывод в файл
   outLog << "Текстура  diffusemap: " << TexturePatch.c_str() << endl;
  out.write(TexturePatch.c_str(), sizeof(char) * (TexturePatch.size() + 1));
  //Спекулярная освещенность
  Color Specular = material -> GetDiffuse(timeValue);
  //Вывод в файл
  outLog << "Текстура Specular: ";
  OutColor(outLog, Specular, 1.0f);
  outLog << endl;
  Write(out, Specular, 1.0f);
  //Получить имя Bumpmap текстуры
  TexturePatch = GetNameTexture(material, ID_BU);
  ...
  //Вывод в файл
  outLog << "Текстура  bumpmap: " << TexturePatch.c_str() << endl;
  out.write(TexturePatch.c_str(), sizeof(char) * (TexturePatch.size() + 1));
  //отражение
  float shinines = material -> GetShininess(timeValue);
  outLog << "Shinines: "	<< shinines << endl;
  out.write((char *)&shinines, sizeof(float));
}

Правка: 5 мар. 2005 17:03

Как спользовать OpenGL в QNX?5 мар. 200513:50#17
Жаботыкин
>3. Институтский предмет "Операционные системы реального времени" имеет мало общего с OpenGL. Это от препода зависит, >конечно.
Нет Linux не ОС реального времени и даже близко не лежит с QNX, так сказал препод.А с преподом я договорился что лаботраторные по графике возможны вполне, тем более  он хочет самому этому научиться.
Как спользовать OpenGL в QNX?5 мар. 200512:10#11
azazello
Спасибо!! бкдем разбираться....
3dmax-plug и ofstream.5 мар. 200511:37#14
_grisha
>стормозил - у тебя ж std::ofstream создается как текстовый - вот и лишний байт при записи 10.
а ему про это и указал
Gluchok
Ты понял в чем дело?
3dmax-plug и ofstream.5 мар. 200511:20#11
Gluchok
Поробуй так:
#include <fstream>
using namespace std;
ofstream ifs;

....

ifs.open(name, ios_base::out | ios_base::binary);

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр