2015-04-06 59 views
1

我正在以編程方式在VRML 2.0中創建一些文件。我需要構造一個圓柱體,它的底部位於原點,頂部位於給定的座標上,但我在計算旋轉時遇到了一些問題。我已經使用了它,但VRML 2.0上的文檔似乎非常稀少。我認爲spherical coordinates最適合我想要做的事情,所以我計算了目標點(x,y,z)的球面座標(r,theta,phi)。然後我創建了下面的文件。如何在原點和VRML中的某些座標之間創建圓柱體

#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 
        } 
       } 
      } 
     } 
    } 
} 

如果您查看此最後一個文件,你會看到,在氣缸實際上是相當接近,但還沒有應用。

+0

不是圓柱節點的默認CENTER就是原點嗎?如果你想讓基地在原點,你需要翻譯它的高度的1/2。此外,圓柱體的高度是根據您希望的頂部位置計算出來的,並且是頂部中間頂部的頂點? http://graphcomp.com/info/specs/sgi/vrml/spec/和http://accad.osu.edu/~pgerstma/class/vnv/resources/info/AnnotatedVrmlRef/Book有一些很好的參考資料。 html – ViennaMike 2015-04-22 16:19:51

+0

圓柱體確實以原點爲中心,但我已經翻譯過了,所以這不是問題。翻譯是邊緣DEF的第七行。頂端的意義確實在中間。我知道第一個參考資料,但對於輪換的具體情況卻非常模糊。第二個參考對我來說是新的,我會看看它。 – user3031033 2015-04-23 06:27:41

回答

1

O.K.,自從我做了這件事以後很長一段時間,但我想我已經明白了爲什麼你的方法不起作用以及如何去做。正如您嘗試的那樣,使用球座標進行計算來自不會自行旋轉的FIXED參考框架。但是,一旦在VRML中的代碼中圍繞y旋轉,z軸不再指向它已經存在的位置,而是旋轉。您的參考框架已更改。

現在,一個方法是使用歐拉角和多個X,Y和Z旋轉,但你應該能夠做到一次旋轉,一旦你找出quaternion(代表的x,y和z座標旋轉矢量和旋轉量)。請參閱this Q&A瞭解公式的來源。

方法: 您希望氣缸座標系中重新定向的y軸與從原點到給定座標的矢量對齊,因此您希望旋轉將點0,r,0移動到指定的新點x,y,z。以下是如何做到這一點:

  1. V1是0,R,O(r是圓柱體的高度)
  2. v2是要將頂部的中心是
  3. 向量的座標=交叉產品(v1,v2)
  4. 歸一化向量a。 VRML規範。說它期望一個正常化的旋轉矢量,所以更安全,而不是抱歉。爲了標準化,計算向量a的長度,然後將x,y和z分量除以長度。
  5. 旋轉角度爲長度(V1)*長度(V2)+ dotproduct(V1,V2)
  6. 所以你只需要一個單一的旋轉變換,在您使用的X,Y和Z值的標準化在步驟4中計算的矢量a和在步驟5中計算的角度。
相關問題