2009-10-04 34 views
14

Như bạn có thể nói từ this screenshot, tôi đang cố gắng tạo một công cụ vật lý cho nền tảng mà tôi đang làm, nhưng tôi đã gặp phải một vấn đề nhất định: tôi cần tìm ra góc của bất kỳ hình tam giác nào mà bạn có thể thấy tạo nên lưới này, để tôi có thể xoay vòng và do đó tăng tốc góc của người chơi trên tam giác đó.Tìm góc bình thường của khuôn mặt của một tam giác ở dạng 3D, với tọa độ đỉnh của nó

screenshot

tôi có thể sử dụng một thuật toán mà tôi tạo ra để tìm vị trí của tất cả 3 điểm của bất kỳ hình tam giác mà các cầu thủ tiếp xúc với, nhưng tôi không biết làm thế nào để sử dụng những điểm làm việc ra vòng quay của tam giác.

Bằng cách xoay, tôi có nghĩa là hướng của bình thường ra khỏi trung tâm của khuôn mặt, tức là góc mà một người sẽ nghiêng người nếu họ đứng trên bề mặt đó. Ai đó có thể đưa ra một loạt các phương trình cho phép giải quyết vấn đề này?

+1

Cảm ơn bạn đã thêm hình ảnh Tôi chỉ là khách :-( –

+0

Cảm ơn các bạn, câu hỏi đã trả lời! –

Trả lời

34

Nếu bạn mang sản phẩm chéo của hai vectơ:

p1 - p0 

p2 - p0 

nơi p0, p1p2 là ba đỉnh của tam giác, bạn sẽ nhận được bình thường. Một tam giác được coi là chỉ về phía bạn nếu các đỉnh được sắp xếp theo chiều kim đồng hồ đối với bình thường bên ngoài của nó. Điều này được gọi là quy tắc tay trái. Hãy tưởng tượng nắm tay trái của bạn với ngón tay của bạn cuộn tròn từ p0 để p1, ngón tay cái của bạn nhô ra theo hướng mặt bình thường:

face pointing away from camera face pointing towards camera

2

Có 2 chuẩn cho tam giác (tất nhiên) và một chuẩn bạn nhận được từ các thuật toán chuẩn phụ thuộc vào thứ tự của đỉnh có. Trích dẫn wiki

"Đối với đa giác (như hình tam giác), bề mặt bình thường có thể được tính là sản phẩm vectơ chéo của hai cạnh (không song song) của đa giác".

Nhưng sự chỉ đạo của bình thường phụ thuộc vào thứ tự của các điểm được lựa chọn, bạn có thể tính toán nó và quyết định sử dụng một số chẩn đoán khác cho dù vector ngược lại là bình thường mà bạn quan tâm.

9

Các sản phẩm chéo là câu trả lời đúng. Đừng quên để bình thường hóa kết quả, và đừng quên rằng nếu tam giác có diện tích bằng không, kết quả là không hợp lệ vì không có xác định tốt bình thường. Về cơ bản, nếu ba đỉnh của bạn là p0, p1 và p2:

vector temp = cross(p1 - p0, p2 - p0); 
if (length(temp) < epsilon) then 
    Degenerate_triangle_error; 
else 
    return normalize(temp); 

Ngoài ra, như câu trả lời khác nói, cho dù bạn nhận được 'lên mặt' hoặc 'xuống đối mặt với' bình thường sẽ phụ thuộc vào thứ tự các đỉnh của bạn .

+2

+1 Điểm tốt về tam giác thoái hóa –

+0

Nếu tam giác có diện tích bằng 0, bạn chưa xác định được một dòng hoặc một điểm, không phải là hình tam giác? Có thể bị bắt với mệnh đề bảo vệ, phải không? – jcolebrand

3

Để hoàn thành trả lời câu hỏi của bạn, khi bạn có đơn vị vector bình thường của tam giác, bạn có thể tính toán góc bằng cách sử dụng sản phẩm chấm.

Sản phẩm dấu chấm của hai vector đơn vị bằng cosin góc giữa chúng, vì vậy nếu bạn tính toán arccos của sản phẩm chấm của vector bình thường đơn vị và đơn vị Up vector của bạn, bạn sẽ nhận được góc dốc của tam giác (góc cách xa).

Ngoài ra, lưu ý rằng OpenGL thường sử dụng hệ tọa độ thuận tay phải, vì vậy nếu bạn đang sử dụng hệ thống đó thì các đỉnh tam giác của bạn sẽ có thứ tự ngược chiều kim đồng hồ.

Các vấn đề liên quan