คุณจะเปลี่ยนลูกบาศก์เป็นทรงกลมได้อย่างไร


31

ฉันพยายามสร้างทรงกลมรูปสี่เหลี่ยมตามบทความซึ่งแสดงผลลัพธ์ดังนี้:

แก้ไข

ฉันสามารถสร้างลูกบาศก์ได้อย่างถูกต้อง:

ก่อน

แต่เมื่อฉันแปลงคะแนนทั้งหมดตามสูตรนี้ (จากหน้าที่ลิงก์ด้านบน):

สูตร

    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));

ทรงกลมของฉันมีลักษณะเช่นนี้:

หลังจาก

อย่างที่คุณเห็นขอบของลูกบาศก์ยังคงโผล่ออกมาไกลเกินไป ลูกบาศก์มีช่วงตั้งแต่-1ถึง+1แกนทั้งหมดเช่นบทความบอกไว้

ความคิดใด ๆ ที่ผิดปกติ?


1
การติดตั้งของคุณมีปัญหา "x = x ... " ด้วยหรือไม่
snake5

8
เครื่องช่วยมองเห็นที่ยอดเยี่ยม ขอบคุณสำหรับการรวมเหล่านั้น
doppelgreener

2
ในการตอบคำถามในชื่อเรื่องคุณสามารถทำให้ปกติจุดยอดของคิวบ์เพื่อทำให้เป็นทรงกลม การกระจายของจุดยอดอาจจะแตกต่างจากวิธีการเชื่อมโยงแม้ว่า
msell

ที่เกี่ยวข้อง: gamedev.stackexchange.com/questions/7189/…
MichaelHouse

คำตอบ:


27

คุณเขียนสูตรผิด

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));

คุณปรับเปลี่ยนต้นฉบับxและเขียนทับมัน จากนั้นคุณปรับเปลี่ยนyตามไม่ได้อยู่ในที่เดิมแต่มีการปรับเปลี่ยนx xจากนั้นคุณปรับเปลี่ยนzขึ้นอยู่กับรุ่นที่ปรับเปลี่ยนทั้งของคนเหล่านั้น

เก็บรักษาต้นฉบับและคำนวณสิ่งนี้:

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));

ใช้ dx, dy และ dz นับจากนี้เป็นต้นไป


อ๊ะ ไม่ได้คิด
Tom Dalling

คุณมีแหล่งตัวอย่างใด ๆ สำหรับโปรแกรมข้างต้นหรือไม่
Vamsi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.