我正在创建一个视频游戏+引擎。我找到了some really amazing tutorials on DirectX 11 programming at RasterTek。不幸的是,他们使用折旧的DirectX SDK,我使用VS 2013和Windows SDK中包含的新DirectX SDK。
我正在转换代码以使用Windows SDK,但我在教程4上遇到了一些问题(是的,我将转换所有49个教程,可能会有更多问题)
从Working with D3DXMath,我被告知D3DXVECTOR3应转换为XMFLOAT3。 然后我尝试在D3DXVec3TransformCoord中使用这些XMFLOAT3,它已被转换为XMVector3TransformCoord。
示例:
XMFLOAT3 up, position, lookAt;
// Setup the vector that points upwards.
up.x = 0.0f
up.y = 1.0f
up.z = 0.0f
// Setup the position of the camera in the world.
position.x = m_positionX;
position.y = m_positionY;
position.z = m_positionZ;
// Setup where the camera is looking by default.
lookAt.x = 0.0f;
lookAt.y = 0.0f;
lookAt.z = 1.0f;
// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
XMVector3TransformCoord(lookAt, rotationMatrix);
XMVector3TransformCoord(up, rotationMatrix);
我收到错误:
IntelliSense:没有合适的用户定义转换 “DirectX :: XMFLOAT3”到“DirectX :: XMVECTOR”存在
我发现我可以使用XMLoadFloat3:
进行TypeCast查找XMVector3TransformCoord(XMLoadFloat3(&lookAt), rotationMatrix);
XMVector3TransformCoord(XMLoadFloat3(&up), rotationMatrix);
我应该这样做,和/或这是最好的方法吗?
完成此操作后,我尝试:
// Translate the rotated camera position to the location of the viewer.
lookAt = position + lookAt;
并收到错误:
IntelliSense:没有运算符“+”匹配这些操作数 操作数类型是:DirectX :: XMFLOAT3 + DirectX :: XMFLOAT3
我能够在D3DXVECTOR3上使用+运算符,但现在不能使用XMFLOAT3?如何将它们一起添加?
答案 0 :(得分:2)
我应该这样做,和/或这是最好的方法吗?
使用 XMVECTOR 代替XMFLOAT3,因为DriectXMath中的大多数功能都使用XMVECTOR。因此,您可以避免无聊的类型转换,并使您的代码清洁。
我能够在D3DXVECTOR3上使用+运算符,但现在不能使用XMFLOAT3? 如何将它们一起添加?
再次使用 XMVECTOR 代替XMFLOAT3
XMVECTOR也有一些缺点(我的意思是代码看起来有点复杂)。使用D3DXVECTOR3,您可以简单地将变量初始化为D3DXVECTOR3 a(x,y,z,w)并将其组件作为a.x,a.y,...但XMVECTOR使用不同的方式。
要初始化XMVECTOR,请使用XMVectorSet函数。
XMVECTOR lookAt = XMVectorSet(x, y, z, w);
要获取XMVECTOR的组件,请使用以下函数。
答案 1 :(得分:2)
<强> 1。我应该吗?
我应该这样做,和/或这是最好的方法吗?
一般来说,您使用Windows SDK编写新代码,但不必转换任何旧代码(您的代码,尤其是其他代码)。这只是浪费时间。您可以安装DirectX SDK以便能够构建它。
另一方面,这是一个了解DrectX及其基础设施的更好机会。例如,从D3DXMath到DirectXMath(以前的XMMath),您将学习基于SSE的数学库的优缺点,并且它是开始编写自己的数学库的好地方。
<强> 2。怎么样?
如果你真的决定做这项艰苦的工作,那么你可以在Chuck Walbourn的一篇好文章中找到90%的信息 - MSFT: Living without D3DX。 另外9.9%你将自己从documentation中找到,并且在查看DirectXMath源代码时会增加0.1%(它是一个头库,所有内联函数都可以自由学习它们)。 您可能也会对MSDN上的another articles by that guy感兴趣。
第3。 operator+
问题
新数学包含两种类型:D3DXVECTORn
和n
,而不是单XMFLOATn
类型(其中XMVECTOR
是多个组件)。对于矩阵也是如此:XMMATRIX
和XMFLOATaXb
(其中a
和b
是矩阵的维度。)
XMFLOAT
人们将被用来存储价值观。它只是一个普通的花车。除了XMLoad*
/ XMStore*
接受它们之外,没有为它们定义的运算符和任何函数。XMVECTOR
和XMMATRIX
是一个工作马:它们在所有函数中使用,并且还有重载运算符(不建议使用。使用XM*
函数)。他们使用超音速SSE内部。但是......很难用它来存储价值。例如,如果您创建XMVECTOR
类成员,则会出现对齐问题。XMFLOAT
s中存储和移动您的值,但在进行任何计算之前,您可以使用XMVECTOR
函数将它们转换为XMMATRIX
和XMLoad*
(正如您对XMVector3TransformCoord()
所做的那样),并且在计算之后,您使用XMFLOAT
函数将它们转换回XMStore*
s。或者您可以通过正确对齐class
和struct
来获得更多利润,这样您就可以直接存储XMVECTOR
和XMMATRIX
(可能需要对齐)内存分配器)。