奇怪的距离Java3D

奇怪的距离Java3D,java,math,3d,java-3d,Java,Math,3d,Java 3d,我会展示一些关于我的问题的图片,这样一切都会更容易理解: 我的第一幅图像显示了轴(x轴由圆柱体组成,y轴由圆锥体组成,z轴由球体组成)和3个圆柱体,定位如下: x轴(右侧)上方的圆柱体支持RotZ(PI/4)和RotX(0)。z轴(左)上方的圆柱体支持RotX(PI/4)和RotZ(0)。中间气缸支持RotX(PI/4)和RotZ(PI/4)。 我的第二幅图像显示了3个圆柱体,它们的角度值完全相同,但原点处有一个球体,并且改变了透视图,以说明什么是奇怪的:上部圆柱体(实验上是“x轴”圆柱体)

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


我的第一幅图像显示了轴(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

编辑:

根据注释,气缸的端点位于

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

原始答案:

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

  (sqrt(0.5), sqrt(0.5), 0),
  (0, sqrt(0.5), sqrt(0.5)),
  (sqrt(0.5), 0.5, 0.5)
  (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


另外,如果你想使图像更加对称,你可以将第三个圆柱体的末端置于(sqrt(0.5),0,sqrt(0.5))。

你能展示你如何准确地创建圆柱体并平移和旋转所有物体吗?圆柱体在垂直位置第一个位于(0,0,0)。我将它平移到(0,1,0),在相同的位置,所以“底部”圆柱体的圆的中心位于(0,0,0)。然后先是罗兹,然后是罗兹。旋转角度由用户给定。如果你仍然认为需要,我可以添加打印屏幕,但我希望我能澄清我打赌旋转和平移之间的顺序需要颠倒,但是你能提供一些源代码吗?但这不是第一个到第二个之间的距离。第一到第三和第二到第三应该是相等的。第三个圆柱体的顶部真的是(0.5,sqrt(0.5),0.5)吗?等等,不,实际上不是。正如你在另一篇博文中所说的(再次感谢),这个点的公式是(sin-alpha,cos-alphacos-beta,cos-alphasin-beta),也就是说(sqrt(0.5),0.5,0.5))。刚刚意识到,如果是这样的话,情况会更糟,因为x和z值在同一个值是合法的。但根据确定的公式,不是这样的,我明白了。(0.5,sqrt(0.5),0.5)是指第二次绕y轴旋转时。似乎一次不止一次的旋转已经让我困惑了。相信我,朋友,我的朋友一周来一直在旋转来弄明白这一点。多亏了你,部分工作完成了