1

我正在以编程方式在 VRML 2.0 中创建一些文件。我需要构建一个圆柱体,其底部位于原点,顶部位于给定坐标处,但在计算旋转时遇到了一些问题。我已经用谷歌搜索过了,但关于 VRML 2.0 的文档似乎非常稀缺。

我假设球坐标最适合我想要做的事情,所以我计算了目标点 (x,y,z) 的球坐标 (r, theta, phi)。然后我在下面创建了文件。

#VRML V2.0 utf8

DEF v1 Transform {
    translation 0 0 0
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF v2 Transform {
    translation x y z
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF edge Transform {
    translation 0 0 0
    children Transform {
        rotation 0 1 0 theta-pi/2
        children Transform {
            rotation 0 0 1 phi-pi/2
            children Transform {
                translation 0 r/2 0
                children Shape {
                    geometry Cylinder {
                        radius .08
                        height r
                    }
                }
            }
        }
    }
}

这是一个带有一些示例值的版本:

#VRML V2.0 utf8

DEF v1 Transform {
    translation 0 0 0
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF v2 Transform {
    translation 4 3 3
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF edge Transform {
    translation 0 0 0
    children Transform {
        rotation 0 1 0 -0.54041949679
        children Transform {
            rotation 0 0 1 -0.92729521779
            children Transform {
                translation 0 2.915475947 0
                children Shape {
                    geometry Cylinder {
                        radius .08
                        height 5.830951895
                    }
                }
            }
        }
    }
}

如果您查看最后一个文件,您会看到圆柱体实际上非常接近,但还没有完全接近。

4

1 回答 1

2

好的,自从我做这些事情以来已经很长时间了,但我想我已经明白了为什么你的方法不起作用以及如何去做。正如您所尝试的那样,使用球面坐标进行计算是来自本身不旋转的固定参考系。但是,一旦您在 VRML 中的代码中围绕 y 旋转,z 轴就不再指向它原来所在的位置,而是也会旋转。你的参考框架改变了。

现在一种方法是使用欧拉角和多个 x、y 和 z 旋转,但是一旦你计算出四元数(它表示旋转向量的 x、y 和 z 坐标和旋转量)。有关公式的来源,请参阅此问答。

方法:您希望圆柱体坐标系中重新定向的 y 轴与从原点到给定坐标的矢量对齐,因此您希望旋转将点 0,r,0 移动到新指定的 x,y,z . 这是如何做到的:

  1. v1 为 0,r,0(r 是圆柱体的高度)
  2. v2 是您希望顶部中心所在的坐标
  3. 向量 a = crossproduct(v1,v2)
  4. 归一化向量 a。VRML 规范。说它需要一个归一化的旋转向量,所以安全总比抱歉好。要归一化,请计算向量 a 的长度,然后将 x、y 和 z 分量除以长度。
  5. 旋转角度为长度(v1)*长度(v2)+点积(v1,v2)
  6. 因此,您只需要一个旋转变换,其中使用第 4 步中计算的归一化向量 a 和第 5 步中计算的角度的 x、y 和 z 值。
于 2015-04-25T22:28:42.300 回答