模型的读取

这篇博客详细介绍了如何在程序中读取并操作3D模型,包括.x、.3ds和.md3格式的模型文件。通过创建TVActor实例,加载纹理和设置材质,实现了对模型的位置、缩放和旋转的控制。此外,还讨论了动态读取.x文件进行动画播放的方法,以及actor结构的定义。最后提到了模型的置换和动态销毁技术。

西昌.何雨锋 模型的读取

读取模型文件:(彝族年学习心得)
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值