¿Cómo agregar e impulsar modelos 3D creados por 3DMAX en proyectos de VC?
#include "stdafx.h"
#include "Load3DS.h "static int gBuffer[50000] = {0}; CLoad3DS::CLoad3DS()
{
m_FilePointer = NULL;
}CLoad3DS::~CLoad3DS()
{ p>
m_FilePointer = NULL;
}
//Abre un archivo 3DS, lee su contenido y libera memoria
bool CLoad3DS::Import3DS ( CLoad3DS::t3DModel *pModel, char *strFileName)
{
char strMessage[255] = {0};
tChunk currentChunk = {0} ;
int i=0; // Abre un archivo 3DS
m_FilePointer = fopen(strFileName, "rb"); el puntero es legal
if(!m_FilePointer)
{
sprintf(strMessage, "Archivo no encontrado: s!", strFileName);
MessageBox(NULL, strMessage, "Error", MB_OK);
MessageBox(NULL, strMessage, "Error", MB_OK) "Error", MB_OK);
regresar false;
}//Después de abrir el archivo, primero lea el primer bloque de datos para ver si es un archivo 3ds
//Si es un archivo 3ds, el primero El ID del bloque de datos debe ser PRIMARIO
// Lea el primer bloque de datos para ver si es un archivo 3ds.
Lea el primer fragmento y determine si es un archivo 3ds
ReadChunk(amp; currentChunk); // Asegúrese de que sea un archivo 3ds
if (currentChunk.ID != PRIMARY )
{
sprintf(strMessage, "No se puede cargar el portabrocas PRIMARIO desde el archivo: s!", strFileName);
MessageBox(NULL, strMessage, " Error ", MB_OK);
return false;
}
// Ahora comienza a leer datos, ProcessNextChunk() es una función recursiva
// Lee el objeto llamando a la siguiente función recursiva
ProcessNextChunk(pModel, amp; currentChunk);
// Calcula las normales de los vértices después de leer el 3ds completo archivo
p>ComputeNormals(pModel); // Liberar espacio de memoria
CleanUp() return true;
}
/ / La siguiente función liberará todo el espacio de memoria y cerrará el archivo
void CLoad3DS::CleanUp()
{
if (m_FilePointer)
{ p>
fclose(m_FilePointer); // Cerrar el puntero del archivo actual
m_FilePointer = NULL // El puntero del archivo es nulo
}
}
void CLoad3DS::ProcessNextChunk(CLoad3DS::t3DModel *pModel, tChunk *pPreviousChunk)
{
t3DObject newObject = { 0}; // Se usa para agregar a la lista vinculada de objetos
tMaterialInfo newTexture = {0}; // Se usa para agregar a la lista vinculada de materiales tChunk currentChunk = {0}; la lista vinculada del bloque actual
tChunk tempChunk = {0}; // Se usa para agregar a la lista de bloques temporales // Cada vez que se lee un nuevo bloque a continuación, se determinará el ID del bloque. Si el bloque es de lectura obligada, continúa leyendo
// Si el bloque no es de lectura obligada, sáltalo // y continúa leyendo los subbloques hasta alcanzar la longitud predeterminada p >
while (pPreviousChunk-gt; bytesRead lt; pPreviousChunk-gt; length)
Esta es la primera vez que se lee el fragmento, la segunda vez que se lee el fragmento.
length)
{
ReadChunk(amp; currentChunk); // Leer el siguiente fragmento // Determinar el número de ID del fragmento
switch (currentChunk. ID)
{
case VERSIÓN: // Número de versión del archivo
// El entero corto sin signo en este bloque representa el número de versión del archivo
// Lee el número de versión del archivo y agrega bytes a la variable bytesRead
currentChunk.bytesRead = fread(gBuffer, 1, currentChunk.length - currentChunk.bytesRead, m_FInterface, m_FInterface, m_FInterface, m_FInterface, m_FInterface, m_FInterface), "Advertencia", MB_OK);
}
break; case OBJECTINFO:
ReadChunk(amp; tempChunk); Leer el siguiente fragmento
// Obtener el número de versión de la cuadrícula
tempChunk.bytesRead = fread(gBuffer, 1, tempChunk.length - tempChunk.bytesRead, m_FilePointer); Aumentar el número de bytes leídos
currentChunk.bytesRead = tempChunk.bytesRead; // Ir al siguiente fragmento
ProcessNextChunk(pModel, amp; currentChunk);
break;
case MATERIAL: // Información del material
// Incrementa el número de material
pModel-gt; // Agrega una estructura de textura en blanco a la lista de texturas
pModel-gt; vctMaterials.push_back(newTexture);
// Ir a la función de carga de material
ProcessNextMaterialChunk(pModel, amp; currentChunk);
break; case OBJECT: //El nombre del objeto
//Este bloque es el encabezado del bloque de información del objeto y lo guarda. el nombre del objeto
pModel-gt; numOfObjects; //Aumentar el número de objetos
//Agregar un nuevo nodo tObject en la cadena de objetos
pModel- gt; vctObjects.push_back(nuevoObjeto);