C++ 围绕Y轴旋转二维正方形,并使用DirectX或openGL在透视投影中显示它

C++ 围绕Y轴旋转二维正方形,并使用DirectX或openGL在透视投影中显示它,c++,rotation,C++,Rotation,我想让一个2D正方形绕Y轴旋转,我想在透视投影中显示它,既不使用DirectX也不使用openGL 如果你看下面的代码,你会注意到我使用的是直接X矩阵和向量的东西-这只是为了让事情变得简单 无论如何,在运行drawSquare方法后,您将看到某种旋转,特别是如果设置旋转角度的动画,但投影看起来不正确 谁能帮帮我,告诉我我做错了什么 Thx伙计们 正如我之前所说:DX只是让事情变得简单: void set3Dto2D( D3DXVECTOR3* a, D3DXVECTOR3& b ) {

我想让一个2D正方形绕Y轴旋转,我想在透视投影中显示它,既不使用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 );
}

它看起来像是围绕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;
}

它应该会起作用


问题在于,假设向量的Z分量在变换应用程序之后保持不变。事实并非如此,因此3Dto2D函数会产生意外的行为。如果将除法替换为a.z分量乘以100,则正方形中的每个z分量都等于1,X/1*.01=X*100。您消除了对z分量的依赖,并且您的函数应该按照预期的方式运行。

为什么要使用3d立方体旋转2D正方形?这正是我想要的。我想让这个正方形旋转,就像从里面看到的立方体的一个侧面。你不是把一个世界应用到屏幕投影上两次吗?一次使用DX函数,然后再使用您自己的简单3D-to-2D函数?@Jongware:我现在无法测试它,但我认为,实际上我非常确定,在3D-to-2D函数之前,顶点不在屏幕坐标中。但我会尽快尝试的。我已经在中重新创建了你的代码。这是一个处理图形逻辑的好工具。我已经把代码放在了嗨,威廉,我确实在绕Y轴旋转正方形。就像正方形是立方体的一个侧面,你从里面看,这个立方体在你周围旋转。啊,我以为你只是想要一个静止的旋转正方形。我想你又误解我了。可能是因为我的英语。我不想让它动起来。还没有。我只想看到正方形在一定程度上发生变化。嗨,威廉,谢谢你的代码,我在处理过程中测试了它,这很酷,但不是我想要的。你写代码的方式,有点正交投影,我想要透视投影,这就是为什么我必须用X和Y除以Z。无论如何,我再次感谢你试图帮助我。好的,我现在有点困惑你的实际问题是什么。我以为你在正确的轮换方面有问题。添加透视校正是一个与旋转无关的小问题。请明确说明您需要帮助的具体问题。
void set3Dto2D( D3DXVECTOR3* a, D3DXVECTOR3& b )
{
    b.x = a->x * 100 + 357.f;
    b.y = a->y * 100 + 357.f;
}