在轴上旋转立方体

时间:2016-03-23 02:51:59

标签: c# 3d rotation system.drawing

我使用paintbox和System.Drawing函数来执行此操作。也是一个将2D转换为3D的自制类。

我尝试先在Y轴上旋转一个立方体然后再进入X和Z.

这些是坐标:

float x1 = 0, y1 = 100, z1 = 0;
float x2 = 100, y2 = 100, z2 = 0;
float x3 = 100, y3 = 0, z3 = 0;
float x4 = 0, y4 = 0, z4 = 0;
float x5 = 0, y5 = 100, z5 = 100;
float x6 = 100, y6 = 100, z6 = 100;
float x7 = 100, y7 = 0, z7 = 100;
float x8 = 0, y8 = 0, z8 = 100;  

在图片框上(只是为了设置图片框中心的坐标):

PointF3D[] cubo = {
new PointF3D(x1 + pictureBox1.Width/2, pictureBox1.Height/2 - y1, z1),
new PointF3D(x2 + pictureBox1.Width/2, pictureBox1.Height/2 - y2, z2),
new PointF3D(x3 + pictureBox1.Width/2, pictureBox1.Height/2 - y3, z3),
new PointF3D(x4 + pictureBox1.Width/2, pictureBox1.Height/2 - y4, z4),
new PointF3D(x5 + pictureBox1.Width/2, pictureBox1.Height/2 - y5, z5),
new PointF3D(x6 + pictureBox1.Width/2, pictureBox1.Height/2 - y6, z6),
new PointF3D(x7 + pictureBox1.Width/2, pictureBox1.Height/2 - y7, z7),
new PointF3D(x8 + pictureBox1.Width/2, pictureBox1.Height/2 - y8, z8)
};

使计时器成为动画:

angulo++;

x2 = (float)((z2 * Math.Sin(angulo * Math.PI / 180)) + (x2 * Math.Cos(angulo * Math.PI / 180)));
z2 = (float)((z2 * Math.Cos(angulo * Math.PI / 180)) - (x2 * Math.Sin(angulo * Math.PI / 180)));

x3 = (float)((z3 * Math.Sin(angulo * Math.PI / 180)) + (x3 * Math.Cos(angulo * Math.PI / 180)));
z3 = (float)((z3 * Math.Cos(angulo * Math.PI / 180)) - (x3 * Math.Sin(angulo * Math.PI / 180)));

x5 = (float)((z5 * Math.Sin(angulo * Math.PI / 180)) + (x5 * Math.Cos(angulo * Math.PI / 180)));
z5 = (float)((z5 * Math.Cos(angulo * Math.PI / 180)) - (x5 * Math.Sin(angulo * Math.PI / 180)));

x6 = (float)((z6 * Math.Sin(angulo * Math.PI / 180)) + (x6 * Math.Cos(angulo * Math.PI / 180)));
z6 = (float)((z6 * Math.Cos(angulo * Math.PI / 180)) - (x6 * Math.Sin(angulo * Math.PI / 180)));

x7 = (float)((z7 * Math.Sin(angulo * Math.PI / 180)) + (x7 * Math.Cos(angulo * Math.PI / 180)));
z7 = (float)((z7 * Math.Cos(angulo * Math.PI / 180)) - (x7 * Math.Sin(angulo * Math.PI / 180)));

x8 = (float)((z8 * Math.Sin(angulo * Math.PI / 180)) + (x8 * Math.Cos(angulo * Math.PI / 180)));
z8 = (float)((z8 * Math.Cos(angulo * Math.PI / 180)) - (x8 * Math.Sin(angulo * Math.PI / 180)));

因此,进行数学研究时,我发现使用旋转矩阵在轴上旋转的公式只是在代码上使用它。立方体开始旋转良好,但在20或更低或更低的情况下,立方体变得越来越小。 代码有问题吗?或者也许我错误地使用了公式?还有另一种方法吗?我尝试使用方向余弦,但立方体只是变形。

2 个答案:

答案 0 :(得分:0)

仔细看看你的公式:

x2 = (float)((z2 * Math.Sin(angulo * Math.PI / 180)) + (x2 * Math.Cos(angulo * Math.PI / 180)));
z2 = (float)((z2 * Math.Cos(angulo * Math.PI / 180)) - (x2 * Math.Sin(angulo * Math.PI / 180)));

单独行,每行都是正确的。但他们并不能很好地融合在一起。原因是您需要x2来计算z2。但是您已经修改了上一行中的x2。所以你需要缓存值:

float rotatedX2 = (float)((z2 * Math.Sin(angulo * Math.PI / 180)) + (x2 * Math.Cos(angulo * Math.PI / 180)));
z2 = (float)((z2 * Math.Cos(angulo * Math.PI / 180)) - (x2 * Math.Sin(angulo * Math.PI / 180)));
x2 = rotatedX2;

其他观点也是如此。

答案 1 :(得分:0)

解决。 我尝试了Nico Schertler的想法,但即使如此,立方体也会变形,这个答案给出了一个想法。我一遍又一遍地重写这些点,所以我只是声明一组新的变量以保留原始点,这样我就可以旋转原始图而不是新图,这就是为什么它不断缩小;我不是一遍又一遍地旋转原始立方体而是新的立方体。

 x2 = (float)((z2a * Math.Sin(angulo * Math.PI / 180)) + (x2a * Math.Cos(angulo * Math.PI / 180)));
 z2 = (float)((z2a * Math.Cos(angulo * Math.PI / 180)) - (x2a * Math.Sin(angulo * Math.PI / 180)));

z2a和x2a将始终保留立方体的原始值以进行计算,而x2和z2是用于绘图目的的新值。

感谢Nico Schertler的想法。