西昌.何雨锋 模型的读取
读取模型文件:(彝族年学习心得)
ITVActor man1[3];
man1[0]=CreateTVActor();
man1[1]=CreateTVActor();
man1[2]=CreateTVActor();
//读取点.x .3ds文件成为物体
xobject1[0]=scene1->CreateMeshBuilder("x1"); //mesh看来是scene中的
xobject1[0]->LoadXFile("..//..//..//Media//fish1.x",tvtrue,tvfalse); //读取.x文件
xobject1[0]->SetTexture(global1->GetTex("wall1"),-1); //mesh也有材质指定
xobject1[0]->EnableSphereMapping(tvfalse,-1,-1); //如果是tvtrue,就出反光金属效果
xobject1[0]->SetPosition(0,0,0);
xobject1[0]->ScaleMesh(500,500,500); //任意放缩
xobject1[1]=scene1->CreateMeshBuilder("x2");
xobject1[1]->Load3DSMesh("..//..//..//Media//tank.3ds",tvtrue,tvtrue,tvtrue,tvfalse,tvtrue);
//这一次读的是3ds文件,但是那些参数什么意思不知道
fac1->LoadTexture("..//..//..//Media//tank.bmp","tank1",-1,-1,TV_COLORKEY_NO,tvtrue,tvtrue);
xobject1[1]->SetTexture(global1->GetTex("tank1"),-1);
xobject1[1]->EnableSphereMapping(tvfalse,-1,-1);
xobject1[1]->SetPosition(300,300,300);
xobject1[1]->ScaleMesh(10,10,10);
xobject1[1]->SetRotation(90,0,0);
//试试读一下人呢
man1[0]->Load("..//..//..//Media//head_2.md3",tvfalse);
man1[1]->Load("..//..//..//Media//upper_2.md3",tvfalse);
man1[2]->Load("..//..//..//Media//lower_2.md3",tvfalse);
//看来人和其他角色都是atctor,分三截,头、身、脚,分别从md3中读取
man1[0]->SetSpeed(1);
man1[1]->SetSpeed(1);
man1[2]->SetSpeed(1);
//不要指望改变任一部分的速度就只是那部分速度变,实际是:全身都加速
scene1->LoadTexture("..//..//..//Media//blue.jpg",-1,-1,"act1");
//一次读取材质,再分别给不同的部分
man1[2]->SetMD3Texture(global1->GetTex("act1"),-1);
man1[1]->SetMD3Texture(global1->GetTex("act1"),-1);
man1[0]->SetMD3Texture(global1->GetTex("act1"),-1);
//读取材质顺序改变,不影响角色形象
man1[1]->AttachTo(&man1[2],0);
man1[0]->AttachTo(&man1[1],0);
//要粘在一起,身粘脚,头粘身,不粘就会各做各的
man1[2]->SetScale(1,1,1);
//渲染中的部分角色要自己渲染的
man1[0]->Render(tvtrue);
man1[1]->Render(tvtrue);
man1[2]->Render(tvtrue);
读取一个动态的.x文件方法(不能指定播放哪一贞段,只能播放整个动画)
//定义3个东东:
ITVMesh animesh1; //mesh,但是用来读动画物体的
ITVKeyFrameAnim aniframe1; //动画帧物体
ITVActor2 act2; //角色,但是确是actor2,有什么区别?好象只有actoer才有playanimation功能
//初始化3个东东,而动画要由mesh来派生
act2=CreateTVActor2();
animesh1=scene1->CreateMeshBuilder("123"); //实践证明,即使没有animesh1与aniframe1这两个物体,也不影响动画.x文件的读取。
aniframe1=animesh1->GetKeyFrameClass();
//读取动画.x文件,都由actor2完成,没看出与animesh/aniframe有什么关系。
act2->Load("..//..//..//media//skmech.x","hehe",tvtrue,tvtrue); //后面两选项允许读材质
act2->PlayAnimation(30); //这里控制的是动画速度而不是从哪桢开始
act2->SetPosition(300,450,300);
act2->SetMaterial(0,-1); //这里第一个材质得为0,否则读不出材质。
//循环中渲染:
act2->Render();
//释放模块中释放actor2:
act2->Release();
act2=NULL;
-----------------------------
这是actor的结构
typedef struct
{
ITVActor2 NPC;
D3DVECTOR Direction;
D3DVECTOR Destination;
D3DVECTOR Pos;
D3DVECTOR ActualPosAI;
D3DVECTOR EndPosAI;
//short Angle;
long Angle;
public:
bool isRunning;
bool isSelected;
bool isEnabled;
} g_Actor ;
--------------------------------
模型的置换方案
mesh1.ResetMesh();
mesh1->LoadXFile("ship.x",tvtrue,tvfalse); //这样就可以立即将旧的mesh换成新的。
--------------------------------
模型的动态销毁
mesh1.Enable(tvfalse);
这篇博客详细介绍了如何在程序中读取并操作3D模型,包括.x、.3ds和.md3格式的模型文件。通过创建TVActor实例,加载纹理和设置材质,实现了对模型的位置、缩放和旋转的控制。此外,还讨论了动态读取.x文件进行动画播放的方法,以及actor结构的定义。最后提到了模型的置换和动态销毁技术。
2729

被折叠的 条评论
为什么被折叠?



