假定坐标系是这样的,水平面的是X轴和Y轴,垂直的是Z轴。Y轴指向屏幕里面。
以下公式表示某点旋转的坐标变换。old是指某点当前的三维坐标(x,y,z)。new是指旋转后的坐标。Rx、Ry、Rz分别表示该点围绕X轴、Y轴、Z轴旋转的度数(弧度)。
Xnew = Xold * (CosRy * CosRz) + Yold * (-CosRx * SinRz + SinRx * SinRy * CosRz) + Zold * (SinRx * SinRz + CosRx * SinRy * CosRz)
Ynew = Xold * (CosRy * SinRz) + Yold * (CosRx * CosRz + SinRx * SinRy * SinRz) + Zold * (-SinRx * CosRx + CosRx * SinRy * SinRz)
Znew = Xold * (-SinRy) + Yold * (SinRx * CosRy) + Zold * (CosRx * CosRy)
以下公式表示三维坐标(x,y,z)转化为屏幕上的二维坐标(X,Y)(这里实际上是指在窗体上的left和top)。用Pset语句在窗体上画点。其中,originX和originY表示坐标系的原点在窗体上的left和top值,Hu表示水平面上的Y轴相对于X轴的(在屏幕上的)夹角弧度。
Me.DrawWidth = 3
Me.PSet (originX + x + y * cosHu, originY - y * sinHu - z), vbBlue
以下公式表示某点旋转的坐标变换。old是指某点当前的三维坐标(x,y,z)。new是指旋转后的坐标。Rx、Ry、Rz分别表示该点围绕X轴、Y轴、Z轴旋转的度数(弧度)。
Xnew = Xold * (CosRy * CosRz) + Yold * (-CosRx * SinRz + SinRx * SinRy * CosRz) + Zold * (SinRx * SinRz + CosRx * SinRy * CosRz)
Ynew = Xold * (CosRy * SinRz) + Yold * (CosRx * CosRz + SinRx * SinRy * SinRz) + Zold * (-SinRx * CosRx + CosRx * SinRy * SinRz)
Znew = Xold * (-SinRy) + Yold * (SinRx * CosRy) + Zold * (CosRx * CosRy)
以下公式表示三维坐标(x,y,z)转化为屏幕上的二维坐标(X,Y)(这里实际上是指在窗体上的left和top)。用Pset语句在窗体上画点。其中,originX和originY表示坐标系的原点在窗体上的left和top值,Hu表示水平面上的Y轴相对于X轴的(在屏幕上的)夹角弧度。
Me.DrawWidth = 3
Me.PSet (originX + x + y * cosHu, originY - y * sinHu - z), vbBlue