2016-06-28 75 views
1

我目前正在使用JavaFX 3D應用程序,並遇到TriangleMesh類中的getNormals()方法。TriangleMesh中getNormals()方法的用法JavaFX

如TriangleMesh類用於創建用戶定義的Java FX 3D obejct並且在
getPoints()被用於添加點
GetFaces中()被用於添加面
getTexCoords()被用於管理三維的紋理對象,
但我不確定TriangleMesh類中的getNormals()方法的用法。

在TriangleMesh類中,我們可以將頂點格式設置爲VertexFormat.POINT_TEXCOORD和VertexFormat.POINT_NORMAL_TEXCOORD。
但是,如果我們將vertexFormat設置爲「VertexFormat.POINT_NORMAL_TEXCOORD」,那麼我們需要將法線索引添加到下面的Faces中:
[ p0,n0,t0,p1,n1,t1,p3,n3,t3,//帶紋理的矩形

P1,N1,T1,P2,N2,T2,P3,N3,T3 //有紋理的矩形的第二三角形的第一三角形 ]

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html

I中描述在3D形狀中沒有發現任何區別,如果我使用vertexFormat作爲POINT_TEXCOORD或POINT_NORMAL_TEXCOORD。

那麼TriangleMesh JavaFX中getNormals()方法的用法是什麼?

由於提前..

回答

3

Use of normals in computer graphics

正常通常在計算機圖形中使用,以確定朝向光源,用於平面着色,或每個角的取向的表面的方向(頂點)用Phong陰影來模擬曲面。


法線效果施加到面部的陰影。

JavaFX 8的標準着色機制是Phong ShadingPhong Reflection Model。默認情況下,Phong Shading假定平滑變化(線性內插)曲面法線向量。這允許您通過提供具有有限頂點幾何體的陰影來渲染球體。默認情況下,normal vector將被計算爲與面垂直。

什麼JavaFX允許您提供自己的法線,而不是依靠默認的計算法則。 JavaFX中的Phong着色算法實現將在您提供的法線之間進行插值,而不是其計算的法線。改變表面法線的方向將改變陰影模型,方法是改變模型如何反射光線反射的光線,實質上光線會以修改後的法線以不同的方向反彈。

維基百科的這個例子顯示了右側phong陰影球體。兩個球體實際上具有相同的幾何形狀。對phong陰影等式有貢獻的法線的分佈是默認的,基於每個面的標準正常計算來平滑插值一個(所以沒有提供用戶法線)。用於計算着色的等式在PhongMaterial javadoc中進行了描述,就散斑顏色和鏡面高光的計算而言,您可以在其中看到對着色算法的正常貢獻。

phong shading

標準3D模型,如obj files可任選地允許用於提供法線:

VN I J K

多邊形和自由形式的幾何語句。

指定具有分量i,j和k的法向量。

頂點法線會影響幾何的平滑着色和渲染。 對於多邊形,使用頂點法線代替法線的實際方面 。對於曲面,頂點法線在整個曲面上進行插值並替換實際的分析曲面法線。

當存在頂點法線時,它們將取代平滑組。

i j k是頂點法線的i,j和k座標。他們 是浮點數


那麼,爲什麼你會要嗎?

最簡單的解釋方法可能是看看smoothing groups(請點擊鏈接,我不會因版權而嵌入)。從鏈接的圖像可以看出,當平滑組應用於一組面時,可以在分組面之間獲得清晰的輪廓(例如摺痕或角)。指定法線允許您完成與平滑組類似的事情,只需要更多的控制,因爲您可以爲每個頂點指定單個法線,而不是整個相關面組。注意JavaFX允許您通過getFaceSmoothingGroups()指定平滑組,以便您不想通過getNormals()定義完整的常規幾何。

另一個類似的想法是normal map(或bump map)。這樣的地圖將正常信息存儲在圖像中而不是作爲矢量信息,如getNormals()方法,所以它是一個稍微不同的東西。但是你可以看到與反射模型算法類似的互動:

normal map

Background Reading - How to understand Phong Materials (and other things)

相關問題