2012-12-21 30 views
18

Cách tiếp cận của tôi là tính hai véc tơ tiếp tuyến song song với trục X và Y tương ứng. Sau đó tính toán sản phẩm chéo để tìm véc tơ thông thường.OpenGL - Làm thế nào để tính toán các chỉ tiêu trong một lưới chiều cao địa hình?

Vectơ tiếp tuyến được cho bởi đường đi qua điểm giữa trên hai đoạn gần nhất như được hiển thị trong hình dưới đây.

enter image description here

tôi đã tự hỏi liệu có một tính trực tiếp hơn, hoặc ít tốn kém về chu kỳ CPU.

+5

Tôi có thể hỏi những gì bạn đã sử dụng để vẽ hình ảnh này không? Nó thực sự tốt đẹp. – Aesthete

+0

Adobe Illustrator – rraallvv

Trả lời

42

Bạn thực sự có thể tính toán nó mà không có một sản phẩm chéo, bằng cách sử dụng "phương pháp sai phân hữu hạn" (hoặc ít nhất tôi nghĩ nó được gọi theo cách này).

Thực ra, nó đủ nhanh để tôi sử dụng nó để tính toán các chuẩn mực trên bay trong một bóng đổ đỉnh.

// # P.xy store the position for which we want to calculate the normals 
    // # height() here is a function that return the height at a point in the terrain 

    // read neightbor heights using an arbitrary small offset 
    vec3 off = vec3(1.0, 1.0, 0.0); 
    float hL = height(P.xy - off.xz); 
    float hR = height(P.xy + off.xz); 
    float hD = height(P.xy - off.zy); 
    float hU = height(P.xy + off.zy); 

    // deduce terrain normal 
    N.x = hL - hR; 
    N.y = hD - hU; 
    N.z = 2.0; 
    N = normalize(N); 
+1

Quá tệ Tôi không thể cung cấp cho bạn nhiều hơn +1: Tôi đã tăng gấp đôi FPS của mình bằng cách sử dụng thuật toán đơn giản của bạn! – Zac

+0

Rất đẹp, hoạt động hoàn hảo cho các tính toán trước của tôi trên CPU –

+0

Rất đẹp! Bạn có thể mở rộng giải pháp của mình cho họa tiết 3D không? – qantik