2009-02-19 28 views
10

Tôi đang viết một ứng dụng iPhone dựa trên opengl và muốn cho phép người dùng dịch xung quanh chế độ xem dựa trên hướng họ di chuyển hai ngón tay trên màn hình. Đối với một ngón tay tôi biết tôi chỉ có thể tính toán vector từ vị trí bắt đầu đến vị trí hiện tại của ngón tay người dùng và sau đó tìm vector đơn vị này để chỉ hướng, nhưng tôi không biết làm thế nào tôi sẽ làm điều này cho hai ngón tay, tôi không nghĩ rằng việc thêm các thành phần của các vectơ và tính toán mức trung bình sẽ làm việc nên tôi bị kẹt khá nhiều.Làm cách nào để tính hướng trung bình của hai vectơ

Trả lời

24

Vector toán hoạt động giống như bạn nghĩ:

v3 = (v1 + v2)/2 

// so: 
v3.x = (v1.x + v2.x)/2; 
// same for Y and Z 
3

thêm chúng và chia bởi hai không làm việc

5

Dễ dàng thí nghiệm tưởng tượng: Bạn nó cho vectơ đơn vị trong x và y. Trực giác bạn có thể hình dung rằng "trung bình" sẽ là một vector đơn vị ở một góc 45 độ lên và bên phải. Đó là chính xác những gì sẽ xảy ra. Thử nghiệm tư tưởng cho thấy rằng bạn cần bình thường hóa mức trung bình theo độ lớn của nó để có được một vector đơn vị. Tôi khuyên bạn nên làm như vậy.

5

Nếu bạn chỉ quan tâm trong chỉ đạo, Bạn nên thêm họ và chuẩn hóa vector kết quả,

(v1 + v2)/abs(v1 + v2) 
+8

Chia cho số không! –

+0

let v1! = V2 ... – RickyA

+0

nếu chỉ quan tâm đến hướng, v1 và v2 phải được chuẩn hóa trước. – pikaille

7

Thông thường nó là tốt hơn để nhân hơn phân chia vì lý do tốc độ khi làm đồ họa lập trình vì vậy tôi muốn giới thiệu này :

v3 = (v1 + v2) * 0.5f;

+8

Chẳng phải công cụ này sẽ được trình biên dịch tối ưu hóa sao cho '/ 2.0' giống với' * 0.5'? –

+0

Có, ít nhất là từ kinh nghiệm của tôi với các trình biên dịch C điển hình. Đó là một câu chuyện khác nếu bạn có một biến số không đổi, hãy nói một vòng lặp dài hơn trong đó bạn chia một cái gì đó cho nó. Sau đó, tôi có thể đo lường sự khác biệt nếu bạn tính toán một biến mới (nghịch đảo) và nhân trong vòng lặp. Tối ưu hóa các trình biên dịch được cải thiện khá nhanh chóng. – oli

3

Xin lỗi, nhưng điều này là sai. Trong thế giới vector, "trung bình" theo nghĩa các thành phần trung bình nghĩa là không có gì. Hãy tưởng tượng (-1 0) và (1 0) -> trung bình = 0 0 ;-)

1

không dễ dàng như bạn thấy: bạn phải sử dụng nội suy slerp để tìm nửa cung trên quả cầu đơn vị: http://en.wikipedia.org/wiki/Slerp Chiều sâu tại đây: http://www.essentialmath.com/index.htm

+0

Về mặt kỹ thuật có, nhưng đối với các vectơ đơn vị, Slerp có trọng số bằng nhau sẽ giảm xuống mức trung bình + đơn giản hóa. –

1

Để hiểu trực giác, bạn có thể vẽ hai vectơ xuống. Sau đó vẽ một đoạn thẳng giữa các điểm cuối của hai điểm. Điểm giữa của phân đoạn này là vectơ trung bình. Điều này phù hợp với bất kỳ số thứ nguyên nào.

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