2014-01-30 49 views
5

我一直在四處搜尋,還沒有找到任何真正好的答案,我的問題呢.. 事情是,我有這個球體..只是一個基本的球體,我想翻轉法線以便球體獲得某種「空心/雕刻效果」,然後將我的紋理應用到球體的「內部」。關於如何翻轉法線的任何想法?翻轉球體上的three.js法線

另外..如果它不可能在three.js中做到這一點..是否有可能導入一個模型,其中法線已翻轉並獲得我正在尋找的效果?

+5

試試'material.side = THREE.BackSide',看看結果是否可以接受。 – WestLangley

+0

這可能工作我猜...任何其他的想法是最受歡迎的:)以上我會嘗試以上和生病回到它是如何去 – Inx

+0

坦克爲hela ..似乎直到有desiered效果:-) – Inx

回答

3

在爲球體創建材質時,請指定{side:THREE.DoubleSide}。這將使臉部從雙方都可見。

您也可以在創建材料後隨時更改它。

16

您可以通過顛倒臉部的順序來翻轉幾何中的法線。然後你必須修復UV。

for (var i = 0; i < geometry.faces.length; i ++) { 

    var face = geometry.faces[ i ]; 
    var temp = face.a; 
    face.a = face.c; 
    face.c = temp; 

} 

geometry.computeFaceNormals(); 
geometry.computeVertexNormals(); 

var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; 
for (var i = 0; i < faceVertexUvs.length; i ++) { 

    var temp = faceVertexUvs[ i ][ 0 ]; 
    faceVertexUvs[ i ][ 0 ] = faceVertexUvs[ i ][ 2 ]; 
    faceVertexUvs[ i ][ 2 ] = temp; 

} 

但是,你可以通過簡單的設置Material.side = THREE.BackSide,或Material.side = THREE.DoubleSide同樣的效果。

無論哪種情況,紋理都會翻轉。您可以預先翻轉紋理,也可以在three.js之外創建模型並導入它。

three.js所r.65

+0

嗯,它使我困惑,使用上面的代碼在天空盒中,我必須設置'side:THREE.FrontSide',但紋理仍然呈現翻轉。使用紋理時,我得到別名。所以我必須建立另一個BoxGeometry?爲什麼?從頂點構建的BoxGeometry將渲染它而不翻轉紋理? – aboutqx

+1

@aboutqx如果你有問題,你需要在新帖子中提問。 – WestLangley

+0

這個解決方案是讓射線腳輪工作的方法。 Ray連鑄機只能看到一邊,doubleSide不起作用。 – arpo

-1

另一種方法是簡單地讓你的對象的幾何體動態手動翻轉法線。

mesh.geometry.dynamic = true 
mesh.geometry.__dirtyVertices = true; 
mesh.geometry.__dirtyNormals = true; 

mesh.flipSided = true; 

//flip every vertex normal in mesh by multiplying normal by -1 
for(var i = 0; i<mesh.geometry.faces.length; i++) { 
    mesh.geometry.faces[i].normal.x = -1*mesh.geometry.faces[i].normal.x; 
    mesh.geometry.faces[i].normal.y = -1*mesh.geometry.faces[i].normal.y; 
    mesh.geometry.faces[i].normal.z = -1*mesh.geometry.faces[i].normal.z; 
} 

mesh.geometry.computeVertexNormals(); 
mesh.geometry.computeFaceNormals(); 
+2

3年前'__dirtyVertices'已從圖書館中刪除。您正在使用庫的舊版本。 – WestLangley