我希望有一个围绕Y轴旋转的2D正方形,我想使用DirectX和openGL在透视投影中显示它。
如果你看一下下面的代码,你会注意到我正在使用直接X矩阵和向量的东西 - 这只是为了让事情变得简单......
无论如何,在运行drawSquare方法后,您会看到某种旋转,特别是如果您为旋转角度设置动画,但投影看起来不正确。
任何人都可以帮助我并告诉我我做错了吗?
Thx家伙。
正如我之前所说:DX的东西只是为了简化:
void set3Dto2D( D3DXVECTOR3* a, D3DXVECTOR3& b )
{
b.x = a->x / ( a->z * .01 ) + 357.f;
b.y = a->y / ( a->z * .01 ) + 357.f;
}
void drawSquare( HDC dc )
{
D3DXMATRIX proj, rot;
// corners of my square
D3DXVECTOR3 pt1( 1, -1, 1 ), pt2( -1, -1, 1 ), pt3( -1, 1, 1 ), pt4( 1, 1, 1 );
// rotation matrix
D3DXMatrixRotationY( &rot, 1.5708f );
// projection matrix
D3DXMatrixPerspectiveFovLH( &proj, 45.0f / 180.0f * D3DX_PI, 1.f, 1.f, 100.0f );
// multiply corners by rotation matrix
D3DXVec3TransformCoord( &pt1, &pt1, &rot );
D3DXVec3TransformCoord( &pt2, &pt2, &rot );
D3DXVec3TransformCoord( &pt3, &pt3, &rot );
D3DXVec3TransformCoord( &pt4, &pt4, &rot );
// multiply rotated corners by projection matrix
D3DXVec3TransformCoord( &pt1, &pt1, &proj );
D3DXVec3TransformCoord( &pt2, &pt2, &proj );
D3DXVec3TransformCoord( &pt3, &pt3, &proj );
D3DXVec3TransformCoord( &pt4, &pt4, &proj );
// transform 3D points into 2D ones
set3Dto2D( &pt1, pt1 ); set3Dto2D( &pt2, pt2 );
set3Dto2D( &pt3, pt3 ); set3Dto2D( &pt4, pt4 );
// draw the lines
MoveToEx( dc, pt1.x, pt1.y, NULL );
LineTo( dc, pt2.x, pt2.y ); LineTo( dc, pt3.x, pt3.y );
LineTo( dc, pt4.x, pt4.y ); LineTo( dc, pt1.x, pt1.y );
}
答案 0 :(得分:0)
看起来你是围绕Y轴旋转,这将围绕“向上”向量旋转你的立方体。您需要围绕Z轴旋转。
此外,变换是绝对操作,因此您需要增加旋转角度才能开始旋转方块。
(花了一些时间来重现你的问题)
首先,你不需要透视你正在尝试做的事情,所以你可以不用线:
D3DXMatrixPerspectiveFovLH( &proj, 45.0f / 180.0f * D3DX_PI, 1.f, 1.f, 100.0f );
问题在于你的3Dto2D代码。如果您更改了以下代码:
void set3Dto2D( D3DXVECTOR3* a, D3DXVECTOR3& b )
{
b.x = a->x / ( a->z * .01 ) + 357.f;
b.y = a->y / ( a->z * .01 ) + 357.f;
}
到
void set3Dto2D( D3DXVECTOR3* a, D3DXVECTOR3& b )
{
b.x = a->x * 100 + 357.f;
b.y = a->y * 100 + 357.f;
}
它应该有用。
问题在于您假设变换应用程序后向量的Z分量保持不变。情况并非如此,因此您的3Dto2D功能会产生意外行为。如果用a.z组件替换devision,则乘以100(方块中的每个z分量等于1,X /(1 * .01)= X * 100)。您消除了对z组件的依赖,并且您的函数应该按预期运行。