Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo agregar e impulsar modelos 3D creados por 3DMAX en proyectos de VC?

¿Cómo agregar e impulsar modelos 3D creados por 3DMAX en proyectos de VC?

// Load3DS.cpp: Implementación de la clase CLoad3DS.

#include "stdafx.h"

#include "Load3DS.h "static int gBuffer[50000] = {0}; CLoad3DS::CLoad3DS()

{

m_FilePointer = NULL;

}CLoad3DS::~CLoad3DS()

{

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)

{

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

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);