Làm thế nào để bạn biến một khối lập phương thành một hình cầu?


31

Tôi đang cố gắng tạo một hình cầu tứ giác dựa trên một bài viết , cho thấy kết quả như thế này:

chính xác

Tôi có thể tạo ra một khối chính xác:

trước

Nhưng khi tôi chuyển đổi tất cả các điểm theo công thức này (từ trang được liên kết ở trên):

công thức

    x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
    y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
    z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Hình cầu của tôi trông như thế này:

sau

Như bạn có thể thấy, các cạnh của khối lập phương vẫn thò ra quá xa. Các khối lập phương từ -1đến +1trên tất cả các trục, như bài báo nói.

Bất cứ ý tưởng những gì là sai?


1
Việc triển khai của bạn có chứa vấn đề "x = x ..." không hay chỉ ở đây?
rắn5

8
Đồ dùng trực quan tuyệt vời. Cảm ơn bạn đã bao gồm những người.
doppelgreener

2
Để trả lời câu hỏi trong tiêu đề, bạn chỉ cần bình thường hóa các đỉnh của khối lập phương để biến nó thành một hình cầu. Sự phân bố các đỉnh có thể sẽ khác với phương thức được liên kết mặc dù.
msell

Câu trả lời:


27

Bạn đã viết sai công thức.

x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Bạn sửa đổi bản gốc xvà ghi đè lên nó. Sau đó, bạn sửa đổi ykhông dựa trên bản gốc xmà là sửa đổi x. Sau đó, bạn sửa đổi zdựa trên phiên bản sửa đổi của cả hai .

Giữ nguyên bản gốc và tính toán điều này:

float dx = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
float dy = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
float dz = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Sử dụng dx, dy và dz từ đó về sau.


Rất tiếc. Không suy nghĩ.
Tom Dalling

Bạn có nguồn mẫu nào cho chương trình trên không?
Vamsi
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.