2010-04-05 101 views
2

這可能有點難以描述,因爲我沒有樣品。我試圖找到一個數學函數或完整的3d功能在PHP或類似的語言,可以幫助我與下列效果:3D效果扭曲紙張

想象一下,如果你要採取平板或紙張,並將其粘貼在一杯水。它不會再平坦了。它會有一條曲線,其中一方可能會被隱藏起來。

任何人都可以引用我一個好的圖書館或資源在網上可以找到這樣的功能?

+0

找到什麼?覆蓋多少紙張? – GManNickG 2010-04-05 23:20:20

+0

像donpal一樣的聲音需要一個貼圖功能,它將在一張平面紙上進行二維座標並將其翻譯成相同的3D座標如果它被包裹在一個圓柱形物體上,那麼就是一張紙。從本質上講,您首先要簡單地觸摸玻璃紙,並在玻璃上彎曲時具有紙張座標的功能。您可以很容易地想出這個功能,將紙張中心的距離轉換爲沿着玻璃邊緣的距離,然後使用小三角來獲得最終座標。 – Triynko 2010-04-05 23:26:03

+0

這是3D效果,所以我們在這裏討論的是爲頁面的4個點/角中的每一個計算新的x,y,z值。其實,那一部分並不難。我可以計算出數學推算紙張的深度,但爲了給曲面帶來彎曲的效果,爲什麼我要尋求外部幫助。 – donpal 2010-04-05 23:27:56

回答

2

假設紙張的中心是x = 0,並且您的圓柱體沿着y軸是垂直的。紙張上的x座標可以等同於圓柱體表面上的弧長。弧長(s)等於角度(弧度)乘以半徑。你的半徑是給定的,所以你可以從弧長和半徑計算出角度。角度=弧長/半徑。由於您現在具有角度和半徑,因此可以計算新的x偏移量,這將是(radius * cos(angle))。所以,你的映射功能將是:

  • 的new_x =半徑* COS(old_x /半徑)
  • new_y = old_y; // y座標不變
  • new_z = radius * sin(old_x/radius);

您必須執行邊界(將x保留在紙上,並確保它不超過周長的一半(x必須小於或等於PI * r)。尤其是z座標,這取決於您的座標系是右手還是左手,或者您想象紙張從圓柱體(背面或前面)開始的位置。最後,您可以使用標準矩陣變換移動並將紙張/圓柱體放置在三維空間中,一旦出現扭曲座標。