Làm thế nào để định hướng một bề mặt bình thường thành một bề mặt khối


7

Câu hỏi ngay lập tức là: trong HLSL, làm cách nào tôi có thể định hướng một bề mặt bình thường được tạo ra trong không gian UV để tôi có thể áp dụng nó lên mặt khối?

Dự án tổng thể là tôi đang cố gắng xây dựng một máy phát hành tinh theo thủ tục. Tôi đang sử dụng một khối lập phương chiếu tới một hình cầu trong đó mỗi mặt là một hình tứ giác. Dự án trung gian là tôi muốn tạo một bản đồ bình thường cho địa hình. Tôi nghĩ rằng cách tốt nhất để tôi làm điều này (và hiểu những gì tôi đang làm) là tạo ra các quy tắc cho phiên bản khối trước, sau đó thực hiện các phép biến đổi để đưa các quy tắc đó vào hình cầu.

Lý tưởng nhất là phương pháp sẽ không liên quan đến mã phân nhánh dựa trên khuôn mặt mà tôi đang làm việc (nghĩa là, nếu chúng ta ở phía trên cùng của khối, thì U = X và V = Y). Nói cách khác, điều tôi hy vọng là một số phép thuật toán học như "Ồ, chỉ cần nhân chéo địa hình bình thường bằng sản phẩm chấm của mặt khối bình thường và blah blah blah".

20/9/10 ETA:

Tôi biết làm thế nào để tính toán thông thường cho một bề mặt phẳng. Vấn đề tiếp theo của tôi là hai lần:

  1. Làm cách nào để xoay bản đồ bình thường để nó được định hướng chính xác trên mỗi mặt của khối lập phương?
  2. Làm thế nào để tôi làm cong bản đồ bình thường phẳng để nó bao bọc hình cầu?

Tôi đã tìm thấy một giải pháp sử dụng ma trận Jacobian, nhưng tôi không thể làm cho nó hoạt động được. Ngay cả khi tất cả các quy tắc đều hướng thẳng lên (tức là một mặt phẳng), mã HLSL liên quan đến Jacobian hoàn toàn làm rối ánh sáng - vì vậy nó khiến tôi không tin tưởng vào việc thực hiện giải pháp của mình.


nhân địa hình bình thường với ma trận 3x3, khác nhau cho mỗi mặt khối?
trăng

Bạn sẽ không mở rộng vectơ từ trung tâm đến bề mặt của mình cho đến khi nó chạm vào khối lập phương, giống như trong các loại ánh xạ khối khác? Hay tôi đang thiếu một cái gì đó ở đây?
drxzcl

Câu hỏi này không liên quan trực tiếp đến việc phát triển trò chơi và rất có thể bạn sẽ nhận được câu trả lời tốt hơn tại Stack Overflow stackoverflow.com
Ricket

Điều này liên quan đến đồ họa thời gian thực, một phần lớn của nhà phát triển trò chơi, vì vậy tôi nghĩ rằng nó có liên quan.
BigSandwich

Đó là đồ họa, thay vì lập trình. Vì vậy, ở đây âm thanh tốt. Và ánh trăng, Ranieri: Họ sẽ không làm câu trả lời tốt hơn chứ?
Vịt Cộng sản

Câu trả lời:


3

Các quy tắc của bạn phải ở trong không gian tiếp tuyến, theo cách đó bạn có thể áp dụng chúng lên bất kỳ bề mặt nào mà bạn có thể tạo một không gian tiếp tuyến (tầm thường cho các hình cầu.) Về cơ bản bản đồ bình thường mô tả cách bình thường khác với bình thường thực tế trên một miếng vá nhỏ trên bề mặt. Không gian tiếp tuyến là những gì bạn có thể cố gắng có được với ma trận Jacobian của mình - đối với một hình cầu, bạn có thể tạo một hệ tọa độ không gian tiếp tuyến tại bất kỳ điểm nào bằng cách sử dụng bình thường tại điểm và hai vectơ vuông góc - chỉ cần định hướng chúng một cách nhất quán ( ví dụ, dọc theo u và v) và bạn đã hoàn thành. Sau đó, bạn có thể dịch vectơ ánh sáng tới vào không gian tiếp tuyến (hoặc ngược lại) và ánh sáng với bình thường mới. Ưu điểm là bản đồ bình thường của bạn sẽ hoạt động trên mọi đối tượng có không gian tiếp tuyến và ánh xạ UV xác định.

Trên khối lập phương, không gian tiếp tuyến của bạn cho mỗi mặt chỉ đơn giản là chính khuôn mặt đó (ví dụ: nếu bạn có khuôn mặt có -Z bình thường, và không gian tiếp tuyến của bạn là + Y, bạn chỉ cần xoay bình thường bằng ma trận ánh xạ -Z đến + Y.)


Tôi có một khái niệm nửa mơ hồ về không gian tiếp tuyến là gì, nhưng tôi không biết làm thế nào để nghe lời khuyên của bạn và làm bất cứ điều gì với nó. Nhưng đó có lẽ hoàn toàn là lỗi của tôi. Đối với đoạn thứ hai - tôi đã cố gắng tránh thực hiện mã phân nhánh trong HLSL, bởi vì sự hiểu biết nghiệp dư của tôi nói rằng mã phân nhánh là một điều rất tệ trong HLSL. Mặc dù nghe có vẻ khó tránh khỏi.
Klay

Không có phân nhánh: Tôi giả sử bạn có một khối lập phương với bản đồ bình thường trên mỗi khuôn mặt. Bây giờ về cơ bản bạn đã mở khối này lên một quả cầu ... điều dễ nhất bạn có thể muốn làm là đặt một quả cầu bên trong khối lập phương của bạn, và lần theo các tia tới khối lập phương và uốn cong bình thường. Giả sử tần số bình thường của bạn là đồng đều trên một bề mặt hình cầu (tức là không đồng đều trên mặt hình khối), điều này sẽ cung cấp cho bạn bản đồ bình thường sẵn sàng sử dụng cho một hình cầu. Mặc dù tôi vẫn không hiểu tại sao bạn có khối lập phương đó? Bạn không thể làm việc một quả cầu ngay lập tức?
Anteru

Lý do tôi sử dụng bản đồ khối là vì việc hiển thị mức độ chi tiết dễ dàng hơn nhiều với sáu phần tư sau đó được ánh xạ tới một hình cầu so với việc thực hiện các phép tính LOD trên bề mặt của hình cầu.
Klay

Ngoài ra, phần trong câu trả lời của bạn nơi bạn nói "chỉ cần định hướng chúng nhất quán" có thể là mấu chốt của vấn đề. Tôi không biết cách định hướng tọa độ uv của mình một cách nhất quán trên sáu mặt khối mà không cần dùng đến thứ gì đó như [if cubeFace == top, sau đó u = x và v = z ...], v.v., dẫn đến phân nhánh I ' m nói về. nhưng tất cả trong tất cả tôi vẫn không thể hình dung được quá trình tổng thể. Xin lỗi vì quá dày đặc.
Klay

0

"Tôi biết làm thế nào để tính toán thông thường cho một bề mặt phẳng." Chính xác thì bạn đang làm điều này như thế nào? Theo như tôi biết, bạn không cần phải làm bất cứ điều gì để ánh xạ nó tới một quả cầu khác hơn là ánh xạ tia cực tím của bạn đến bề mặt quả cầu một cách chính xác. Bản đồ bình thường luôn ở trong một mặt phẳng "phẳng" vì bản thân kết cấu là "phẳng". Hình dạng của đối tượng mà bạn áp dụng bản đồ bình thường không quan trọng.


Thuật toán lấy mẫu các điểm xung quanh và bội số chéo (hoặc đó là sản phẩm chấm?) Các sườn để có vectơ vuông góc với các sườn. Ít nhất, đó là hồi ức mơ hồ của tôi - Tôi đang làm việc và không thể kiểm tra ATM.
Klay

Ngoài ra, nếu tôi hiểu bạn một cách chính xác, có vẻ như tôi cần "nướng" độ cong của quả cầu vào bản đồ bình thường để ánh sáng chính xác. Một lần nữa, tôi xin lỗi vì quá dày đặc, nhưng một số loại sơ đồ và / hoặc mã giả có thể giúp ích.
Klay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.