#include<d3dx9.h>
#include<direct.h>
#include <fstream>
#include <ctime>
#include"CWindow.h"
#include "GObject.h"
namespace T3D {
using namespace std;
/*
静态模型节点定义
*/
CStaticModel::CStaticModel(IDirect3DDevice9* dev, LPCWSTR Path)
{
ID3DXBuffer* MatBuffer = NULL;
wchar_t* MPath = NULL;
if (FAILED(D3DXLoadMeshFromX(MPath = (wchar_t*)Path, D3DXMESH_SYSTEMMEM, dev, NULL, &MatBuffer,
NULL, &Num, &Mesh)))
{
char* I = NULL;
HRESULT HE = NULL;
if (FAILED(HE = D3DXLoadMeshFromX(MPath = GetAbsPath(I = WtoC(Path)), D3DXMESH_SYSTEMMEM,
dev, NULL, &MatBuffer, NULL, &Num, &Mesh)))
{
delete I;
MessageBox(NULL, L"无法载入模型,即将结束进程。", 0, 0);
exit(-1);
}
delete I;
}
D3DXMATERIAL* PMat = (D3DXMATERIAL*)MatBuffer->GetBufferPointer();
Materials = new D3DMATERIAL9[Num];
Textures = new LPDIRECT3DTEXTURE9[Num];
for (int i = 0; i < Num; i++)
{
this->Materials[i] = PMat[i].MatD3D;
this->Materials[i].Ambient = this->Materials->Diffuse;
wchar_t* I = NULL;
char* II = NULL;
if (PMat[i].pTextureFilename != NULL && strlen(PMat[i].pTextureFilename) > 0)
{
if (FAILED(D3DXCreateTextureFromFile(dev, I = CtoW(PMat[i].pTextureFilename), &Textures[i])))
{
delete I;
I = NULL;
if (FAILED(D3DXCreateTextureFromFile(dev,
I = GetAbsPath(II = WtoC(MPath), PMat[i].pTextureFilename), &(Textures[i]))))
{
delete I;
delete II;
MessageBox(NULL, L"无法载入纹理,即将结束进程。", 0, 0);
exit(-1);
}
}
}
delete II;
delete I;
I = NULL; II = NULL;
}
MPath = NULL;
}
CStaticModel::~CStaticModel()
{
for (int i = 0; i < (sizeof(*Textures) / sizeof(Textures[0])); i++)
{
this->Textures[i]->Release();
}
this->Mesh->Release();
delete (this->Materials);
delete (this->Materials);
}
D3DXMATRIX CStaticModel::GetWorldMatrix()
{
return *D3DXMatrixTranslation(NULL, Pos.x, Pos.y, Pos.z);
}
void CStaticModel::run(IDirect3DDevice9* dev)
{
for (int i = 0; i < Num; i++)
{
dev->SetMaterial(&Materials[i]);
dev->SetTexture(0, Textures[i]);
Mesh->DrawSubset(i);
}
}
/*
可移动摄影机节点定义
*/
CMovableCamera::CMovableCamera(IDirect3DDevice9* pDevice, D3DXVECTOR3 CAMPos, D3DXVECTOR3 AT, FLOAT Asp, FLOAT Step,
FLOAT Fangle, BOOL UKEY, BOOL RorL, FLOAT Fovy, FLOAT Near, FLOAT Far, GKEY Key) : Step(Step), Fangle(Fangle), Key(Key), UKEY(UKEY), RorL(RorL)
{
m_pDevice = pDevice;
m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -200.0f);
m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
this->SetCameraPosition(&CAMPos);
this->SetTargetPosition(&AT);
D3DXMATRIX P;
this->SetProjectionMartix(D3DXMatrixPerspectiveFovLH(&P, Fovy, Asp, Near, Far));
}
CMovableCamera::~CMovableCamera(void)
{
;
}
void CMovableCamera::CalculateViewMatrix(D3DXMATRIX* pMatrix)
{
D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);
D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector);
D3DXVec3Normalize(&m_vUpVector, &m_vUpVector);
D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector);
D3DXVec3Normalize(&m_vRightVector, &m_vRightVector);
pMatrix->_11 = m_vRightVector.x;
pMatrix->_12 = m_vUpVector.x;
pMatrix->_13 = m_vLookVector.x;
pMatrix->_14 = 0.0f;
pMatrix->_21 = m_vRightVector.y;
pMatrix->_22 = m_vUpVector.y;
pMatrix->_23 = m_vLookVector.y;
pMatrix->_24 = 0.0f;
if (RorL == RL_L)
{
pMatrix->_31 = m_vRightVector.z;
pMatrix->_32 = m_vUpVector.z;
pMatrix->_33 = m_vLookVector.z;
pMatrix->_34 = 0.0f;
}
else
{
pMatrix->_31 = -m_vRightVector.z;
pMatrix->_32 = -m_vUpVector.z;
pMatrix->_33 = -m_vLookVector.z;
pMatrix->_34 = 0.0f;
}
pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition);
pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition);
pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition);
pMatrix->_44 = 1.0f;
}
void CMovableCamera::SetTargetPosition(D3DXVECTOR3* PVector)
{
if (PVector)
m_vTargetPosition = (*PVector);
else
m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
m_vLookVector = m_vTargetPosition - m_vCameraPosition;
D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);
D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector);
D3DXVec3Normalize(&m_vUpVector, &m_vUpVector);
D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector);
D3DXVec3Normalize(&m_vRightVector, &m_vRightVector);
}
void CMovableCamera::SetCameraPosition(D3DXVECTOR3* PVector)
{
D3DXVECTOR3 v = D3DXVECTOR3(0.0f, 0.0f, -250.0f);
m_vCameraPosition = PVector ? (*PVector) : v;
}
void CMovableCamera::SetViewMatrix(D3DXMATRIX* PMatrix)
{
if (PMatrix)
m_matView = *PMatrix;
else
CalculateViewMatrix(&m_matView);
m_pDevice->SetTransform(D3DTS_VIEW, &m_matView);
m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13);
m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23);
m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33);
}
void CMovableCamera::SetProjectionMartix(D3DMATRIX* PMatrix)
{
if (PMatrix)
m_matProj = *PMatrix;
else
D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0F, 800 / 600, 1.0f, 30000.0f);
m_pDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);
}
void CMovableCamera::MoveAlongRightVec(float fUnits)
{
m_vCameraPosition += m_vRightVector * fUnits;
m_vTargetPosition += m_vRightVector * fUnits;
}
void CMovableCamera::MoveAlongUpVec(float fUnits)
{
m_vCameraPosition += m_vUpVector * fUnits;
m_vTargetPosition += m_vUpVector * fUnits;
}
void CMovableCamera::MoveAlongLookVec(float fUnits)
{
m_vCameraPosition += m_vLookVector * fUnits;
m_vTargetPosition += m_vLookVector * fUnits;
}
void CMovableCamera::RotationRightVec(float fAngle)
{
D3DXMATRIX r;
D3DXMatrixRotationAxis(&r, &m_vRightVector, fAngle);
D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &r);
D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &r);
m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);
}
void CMovableCamera::RotationUpVec(float fAngle)
{
D3DXMATRIX r;
D3DXMatrixRotationAxis(&r, &m_vUpVector, fAngle);
D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &r);
D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &r);
m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);
}
void CMovableCamera::RotationLookVec(float fAngle)
{
D3DXMATRIX r;
D3DXMatrixRotationAxis(&r, &m_vLookVector, fAngle);
D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &r);
D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &r);
m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);
}
void CMovableCamera::IFKey()
{
if (UKEY)
{
if (KEY_DOWN(Key.FORWORD))
this->MoveAlongLookVec(Step);
if (KEY_DOWN(Key.BACK))
this->MoveAlongLookVec(-Step);
if (KEY_DOWN(Key.LIFT))
this->MoveAlongRightVec(-Step);
if (KEY_DOWN(Key.RIGHT))
this->MoveAlongRightVec(Step);
if (KEY_DOWN(Key.UP))
this->MoveAlongUpVec(Step);
if (KEY_DOWN(Key.DOWN))
this->MoveAlongUpVec(-Step);
if (KEY_DOWN(GK_R))
this->RotationUpVec(Fangle);
if (KEY_DOWN(GK_F))
this->RotationUpVec(-Fangle);
if (KEY_DOWN(GK_T))
this->RotationRightVec(-Fangle);
if (KEY_DOWN(GK_G))
this->RotationRightVec(Fangle);
}
}
void CMovableCamera::run(IDirect3DDevice9* dev)
{
this->IFKey();
D3DXMATRIX matView;
D3DXMATRIX View;
this->CalculateViewMatrix(&matView);
this->Ge
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这是一个闲来无事自制的半成品引擎。 基本逻辑架构、渲染流程已经完成。 目前仍存在诸多问题 : 可以实现的功能较少; 无法进行深度测试(在我电脑上是这样,设备结构体有问题); 可以从灰度图中导入地形但无法被自定义光源照亮; 工具函数使用堆但会导致内存泄漏(可以解决); 没有太多注释、没有文档; 或许可以将RenderEr类改为场景类,在CWindow类下动态更改渲染的场景(添加类似“组”的类); 或许应该禁止直接从CWindow中直接获取设备对象,提供其他接口; 学习图形不久,欢迎诸位的修改意见! 注 : 引用时请注明出处,非常感谢!
资源推荐
资源详情
资源评论
收起资源包目录
The T.zip (10个子文件)
The T
Tools.h 1KB
GObject.cpp 14KB
RenderEr.h 876B
Tools.cpp 1KB
GObject.h 4KB
RenderEr.cpp 2KB
CWindow.h 1KB
CWindow.cpp 3KB
T2D.cpp 18B
T2D.h 62B
共 10 条
- 1
资源评论
vzzh0
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功