0

我将展示一些关于我的问题的图片,这样一切都会更容易理解:

图 1
图 2

我的第一张图片显示了轴(x 轴由圆柱体组成,y 轴由圆锥体组成,z 轴由球体组成)和 3 个圆柱体的位置如下:

x 轴上方的圆柱体(右)支持 RotZ(PI/4) 和 RotX(0)。z 轴上方的圆柱体(左)支持 RotX(PI/4) 和 RotZ(0)。中间气缸支持RotX(PI/4)和RotZ(PI/4)。

我的第二张图片显示了 3 个角度值完全相同的圆柱体,但它们的原点是一个球体并且视角发生了变化,这使得奇怪的是显而易见:上圆柱体(实验上是“x 轴”圆柱体)更靠近中间圆柱体(第一张图像中的中间圆柱体)比下圆柱体(第一张图像中的“z轴”圆柱体)。从任何角度都可以看到差异,所以问题不是透视。

我认为问题可能是我进行旋转的方式。圆柱体的长度为 2f,所以我首先将圆柱体平移到 (0,1,0),这样圆柱体一端的圆中间的点。这个想法是我想围绕 (0,0,0) 点旋转。然后进行旋转。
这可能是问题吗?

下面的代码显示了如何放置圆柱体

 private void addSimpleBound(float x,float y,float z)
    {


    Cylinder b=new Cylinder();
    TransformGroup tg=new TransformGroup();
    tg.addChild(b);
    TransformGroup element=translate(tg, new Vector3f(0f,1f,0f)); 
    TransformGroup gr=rotate(element,xAngle,zAngle);
    elements.addChild(gr);
}
    TransformGroup rotate(Node node,
        double xAngle,
        double zAngle)
{

    Transform3D tiltAxisXform = new Transform3D();
    Transform3D tempTiltAxisXform = new Transform3D();
    tiltAxisXform.rotX(xAngle);
    tempTiltAxisXform.rotZ(zAngle);
    tiltAxisXform.mul(tempTiltAxisXform);
    TransformGroup rotatedGroup = new TransformGroup(tiltAxisXform);
    rotatedGroup.addChild(node);
    return rotatedGroup;
}// The rotation method

带轴的透视图

4

1 回答 1

1

编辑:

根据评论,您的圆柱体的端点位于

  (sqrt(0.5), sqrt(0.5), 0),
  (0, sqrt(0.5), sqrt(0.5)),
  (sqrt(0.5), 0.5, 0.5)

这意味着距离实际上是不对称的。为了获得更对称的结果,第二次旋转必须围绕 y 轴。

原答案:

这一点也不奇怪。你的圆柱体的末端在

  (sqrt(0.5), sqrt(0.5), 0),
  (0, sqrt(0.5), sqrt(0.5)),
  (0.5, sqrt(0.5), 0.5)

第一端到第二端的距离为 1,第一端到第三端(或第二端到第三端)的距离为 sqrt(1 - sqrt(0.5)) < 1。

PS如果你想让图像更对称,你可以把第三个圆柱体的末端放在(sqrt(0.5),0,sqrt(0.5))。

于 2012-11-03T21:35:53.130 回答