围绕Y轴旋转2D正方形,并使用DirectX和openGL以透视投影显示它

时间:2013-12-29 19:47:18

标签: c++ rotation

我希望有一个围绕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 );
}

1 个答案:

答案 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组件的依赖,并且您的函数应该按预期运行。