2013-05-29 34 views
5

Tôi đã sao chép và lật một đối tượng bằng cách sử dụng thang âm, làm cho mặt đơn của tôi bị nghịch đảo. Câu hỏi của tôi là, làm thế nào tôi có thể lật các normals quá?Three.js: Làm thế nào để lật các chỉ tiêu sau thang âm

Tôi không muốn sử dụng material.side = THREE.DoubleSide, vì lý do: 1) không hoạt động đúng (một số sắc thái được vẽ từ bên trong) và 2) muốn giữ hiệu suất càng nhiều càng tốt. Vì vậy, DoubleSide không phải là một lựa chọn cho tôi.

Thats cách đối tượng của tôi bị lật.

mesh.scale.x = - scale_width; 

Cảm ơn bạn trước!

+0

Tôi cũng đã đọc câu trả lời của bạn cho câu hỏi này và tôi nghĩ lựa chọn nào khác để tôi "lật" đối tượng của tôi hơn là mở rộng âm? Có lẽ bạn có thể tư vấn cho tôi một giải pháp tốt hơn so với quy mô tiêu cực? Nhiệm vụ của tôi là xây dựng một đối tượng đối xứng: một khung hình cho một hình ảnh cho một phòng trưng bày nghệ thuật ảo. Vì vậy, tôi có hình dạng của một bên khung hình, chúng thậm chí có thể khác nhau ở dạng của chúng. Mỗi cạnh khung có hai góc 45 độ, tròn hoặc sắc nét, bất kể cái gì. Vì vậy, tôi tạo ra một góc và sao chép nó, hơn tôi tiêu cực quy mô nó, để có được một lật đầy đủ. Bất kỳ đề nghị làm thế nào để xử lý mà không có quy mô tiêu cực? –

Trả lời

5

tôi sẽ tư vấn cho chống lại quy mô tiêu cực đối với một loạt toàn bộ lý do, như được giải thích trong liên kết này: Transforming vertex normals in three.js

Bạn thay vì có thể áp dụng một ma trận nghịch đảo để hình học của bạn như vậy

geometry.scale(- 1, 1, 1); 

Như đã giải thích ở liên kết, một hệ quả để làm điều này, tuy nhiên, là các khuôn mặt hình học sẽ không còn có thứ tự quanh co ngược chiều kim đồng hồ, nhưng theo chiều kim đồng hồ.

Bạn có thể di chuyển ngang hình học của mình theo cách thủ công và lật thứ tự quanh co của mỗi khuôn mặt. Điều này có thể làm việc cho bạn - nếu bạn không có kết cấu được áp dụng và không sử dụng tia cực tím. Nếu hình học của bạn được kết cấu, các tia cực tím cũng cần phải được sửa chữa.

Thực ra, một tiện ích đảo ngược hình học sẽ là một bổ sung tuyệt vời cho ba.js. Hiện tại, những gì bạn muốn làm không được thư viện hỗ trợ.

three.js r.72

+0

Cảm ơn bạn đã giải thích, do đó, nó khuyến khích để suy nghĩ về việc thực hiện tính năng này :) –

3

Câu hỏi này là hai tuổi, nhưng trong trường hợp bất cứ ai đi ngang qua. Dưới đây là một cách không phá hủy để làm điều này:

Bạn có thể nhập "bẩn đỉnh/normals" chế độ, lật normals bằng tay:

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(); 

+1 @WestLangley, tôi đề nghị bạn không bao giờ sử dụng thang âm.

+0

Thú vị. Nhưng lưu ý rằng .flipSided không còn là một phần của THREE.js nữa. Xem u/WestLangley trả lời ở đây: http://stackoverflow.com/questions/19673913/three-js-flipsided-property. – steveOw

+0

hình học .__ dirtyVertices & geometry .__ dirtyNormals cũng không còn được dùng nữa. Xem https://github.com/mrdoob/three.js/wiki/Updates – Reimund