实验十二、圆柱体和球的创建
1、 实验目的
1、 掌握D3D的圆柱体和球的创建
2、 实验步骤
1、 打开vs.net2005,打开ftp上的3Ddemo11项目,执行并观看结果。
2、 修改纹理指针和材质结构以及世界变换结构体变量定义,改成数组定义
LPDIRECT3DTEXTURE9
g_pTexture[10];
D3DMATERIAL9
matMaterial[10];
OBJREC objRec[10];
3、 在InitD3D函数中添加对纹理和材质的初始化,以及调用设置函数。
for(int i=0;i<10;i++)
{
g_pTexture[i]=NULL;
ZeroMemory(&matMaterial[i],sizeof(matMaterial[i]));
ZeroMemory(&objRec[i], sizeof(objRec[i]));
objRec[i].fScale = 1.0f;
}
if(FAILED(SetTexture(TEXT("sp.bmp"),0)))
{
return E_FAIL;
}
if(FAILED(SetTexture(TEXT("wall.bmp"),1)))
{
return E_FAIL;
}
if(FAILED(InitLight()))
{
return E_FAIL;
}
4、
InitMaterial();
5、 修改设置纹理函数,记得也修改声明
HRESULT SetTexture(TCHAR *pszTexturePath,int num)
{
if (FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,pszTexturePath,&g_pTexture[num])))
{
return E_FAIL;
}
return S_OK;
}
6、 修改世界变换函数,记得修改相应的函数声明
void SetupRotation(int num)
{
D3DXMATRIX matTrans,matWorld;
D3DXMATRIX matRotateX,matRotateY,matRotateZ;
D3DXMATRIX matScale;
D3DXMatrixRotationX(&matRotateX,objRec[num].fXAngle);
D3DXMatrixRotationY(&matRotateY,objRec[num].fYAngle);
D3DXMatrixRotationZ(&matRotateZ, objRec[num].fZAngle);
D3DXMatrixMultiply(&matWorld, &matRotateX, &matRotateY);
D3DXMatrixMultiply(&matWorld, &matWorld, &matRotateZ);
D3DXMatrixScaling(&matScale,objRec[num].fScale ,objRec[num].fScale ,objRec[num].fScale);
D3DXMatrixMultiply(&matWorld, &matWorld, &matScale);
D3DXMatrixTranslation(&matTrans,objRec[num].x,objRec[num].y,objRec[num].z);
D3DXMatrixMultiply(&matWorld, &matTrans,&matWorld);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
}
7、 修改材质函数
void InitMaterial()
{
matMaterial[0].Diffuse = D3DXCOLOR(1.0,1.0,1.0,1.0);//rgbaDiffuse;
matMaterial[0].Ambient = D3DXCOLOR(1.0,1.0,1.0,1.0);//rgbaAmbient;
matMaterial[0].Specular =D3DXCOLOR(0.0,0.0,0.0,1.0);// rgbaSpecular;
matMaterial[0].Power = 100.0f;//高光点的锐度
matMaterial[0].Emissive = D3DXCOLOR(1.0,1.0,1.0,1.0);//rgbaEmissive;
matMaterial[1].Diffuse = D3DXCOLOR(1.0,1.0,1.0,1.0);
matMaterial[1].Ambient = D3DXCOLOR(1.0,1.0,1.0,1.0);
matMaterial[1].Specular = D3DXCOLOR(0.0,0.0,0.0,1.0);
matMaterial[1].Power = 100.0f;//高光点的锐度
matMaterial[1].Emissive = D3DXCOLOR(0.0,0.0,0.0,1.0);
}
8、 修改渲染函数
void Render()
{
if(g_pD3DDevice)
{
//清屏
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,120,0), 1.0f, 0);
//开始场景渲染
if (SUCCEEDED(g_pD3DDevice->BeginScene()))
{
SetupPerspective(main_hwnd);
SetupViewer();
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->SetStreamSource(0, g_pVBSphere,0, sizeof(CUSTOMVERTEX));
objRec[0].x=0;
objRec[0].fYAngle +=0.01;
objRec[0].fScale =2;
SetupRotation(0);
g_pD3DDevice->SetTexture(0,g_pTexture[0]);
g_pD3DDevice->SetMaterial(&matMaterial[0]);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0,
iSpherePointNums-2);
objRec[1].x=-15;
objRec[1].fScale =0.5;
objRec[1].fYAngle +=0.05;
SetupRotation(1);
g_pD3DDevice->SetTexture(0,g_pTexture[1]);
g_pD3DDevice->SetMaterial(&matMaterial[1]);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0,
iSpherePointNums-2);
//结束场景渲染
g_pD3DDevice->EndScene();
}
//后备表面呈现出来
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
}
9、 修改摄像机的位置
void SetupViewer()
{
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f, 5.0f,-18.0f), //Camera Position
&D3DXVECTOR3(0.0f, 0.0f, 0.0f), //Look At Position
&D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //Up Direction
g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
}
10、 消息处理函数的鼠标消息不要
//case WM_LBUTTONDOWN:
//
ptOld.x = LOWORD(lParam);
//
ptOld.y = HIWORD(lParam);
//
return 0;
//case WM_MOUSEMOVE:
//
if (MK_RBUTTON == wParam)
//
{
//
POINT pt;
//
RECT
rect;
//
//
pt.x = LOWORD(lParam);
//
pt.y = HIWORD(lParam);
//
GetWindowRect(hWnd,&rect);
//
objRec.fXAngle -= 10*(float)(pt.y - ptOld.y ) / (float)(rect.bottom - rect.top );
//
objRec.fYAngle -= 10*(float)(pt.x - ptOld.x ) / (float)(rect.right - rect.left );
//
ptOld = pt;
//
}
//
break;
10、修改退出函数
void CleanUp()
{
for(int i=0;i<10;i++)
{
if(g_pTexture[i])
{
g_pTexture[i]->Release();
g_pTexture[i]=NULL;
}
}
if(g_pD3DDevice)
{
g_pD3DDevice->Release();
g_pD3DDevice=NULL;
}
if(g_pD3D)
{
g_pD3D->Release();
g_pD3D=NULL;
}
}
---------------------------------------------------------------------------------------
绕任意轴旋转矩阵的创建(例如)
D3DXMatrixRotationAxis(&matRotate,&D3DXVECTOR3(-1.0,1.0,0.0),objRec[num].fAngle);
本文档为【三维编程实验十三、公转和自转】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。