เหตุใดจึงใช้พิกัด z ในแถบสามเหลี่ยม open gl

ฉันเพิ่งเริ่มใช้ openGL ซึ่งฉันกำลังสอนตัวเองจากหนังสือ ในหนังสือของฉัน ฉันได้รับคำสั่งให้สร้างทีมสี่คนโดยใช้แถบสามเหลี่ยมเพราะมันมีประสิทธิภาพมากกว่า หนังสือเล่มนี้ใช้จุดยอดเหล่านี้เพื่อสร้างรูปสี่เหลี่ยม

    vertices.push_back(-0.5f);
    vertices.push_back(0.0f);
    vertices.push_back(0.0f);

    vertices.push_back(0.5f);
    vertices.push_back(0.0f);
    vertices.push_back(0.0f);

    vertices.push_back(-0.5f);
    vertices.push_back(0.0f);
    vertices.push_back(-1.0f);

    vertices.push_back(0.5f);
    vertices.push_back(0.0f);
    vertices.push_back(-1.0f);

ฉันไม่เข้าใจว่าทำไมแกน z จึงไม่คงที่ ดูเหมือนว่าแกน z ควรคงที่ และแกน y ควรเปลี่ยนเพื่อให้แสดงสี่เหลี่ยมจัตุรัสในรูปแบบ 2d ฉันไม่เข้าใจว่าทำไมถึงใช้แกน z

นี่คือรหัสที่เหลือ

เพื่อโหลดจุดยอดในบัฟเฟอร์

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

เพื่อแสดงสี่เหลี่ยมจัตุรัส

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 5.0, 0.1, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);

แม้ว่าฉันจะไม่เข้าใจเรื่องนี้ แต่จัตุรัสก็ยังคงแสดงอย่างถูกต้อง ดังนั้นจึงต้องใช้งานได้


person Popgalop    schedule 01.12.2013    source แหล่งที่มา


คำตอบ (2)


เพื่อให้รูปสี่เหลี่ยมเข้าใจได้ จุดทั้งสี่ควรอยู่ในระนาบ ไม่จำเป็นต้องเป็นระนาบที่มี z=const หากคุณดูที่จุดยอดเหล่านั้น คุณอาจพบว่า y มีค่าเป็น 0 ตลอดเวลาสำหรับจุดทั้ง 3 จุด ดังนั้นรูปสี่เหลี่ยมจึงถูกกำหนดไว้ในระนาบ xz คุณจะเห็นได้ว่ากล้องวางอยู่ที่ (0, 5, 0.1) โดยมองลงไปที่จุดกำเนิด ดังนั้นการใช้ระนาบ xz จึงสมเหตุสมผล

person derhass    schedule 01.12.2013
comment
หนังสือของฉันยังไม่ได้อ่านมากกว่า gluLookAt แต่ก็สมเหตุสมผลดี ขอบคุณ - person Popgalop; 01.12.2013
comment
@Popgalop: โปรดทราบว่าการใช้งาน gluLookAt() ที่นี่ค่อนข้างแย่ พวกเขาใช้วิธีลัดในการตั้งค่า z ของตำแหน่งกล้องเป็น 0.1 เพื่อหลีกเลี่ยงการมองตรงลง เพราะพวกเขาใช้เวกเตอร์ขึ้นที่ผิดสำหรับสถานการณ์นั้น ไม่ใช่ว่า gluLookAt() และสิ่งอื่น ๆ อีกมากมายในโค้ดที่คุณโพสต์นั้นเลิกใช้แล้วและถูกลบออกจากโปรไฟล์หลักที่ทันสมัยของ OpenGL คุณอาจจะพิจารณาการเรียนรู้แบบสมัยใหม่... - person derhass; 01.12.2013

คุณมองไปตามแกน y ดังนั้น y จึงคงที่เพื่อสร้างสี่เหลี่ยมจัตุรัสตั้งฉากกับวิวพอร์ต ด้วยการเรียก gluLookAt() คุณจะกำหนดตำแหน่งกล้องและทิศทางการรับชม คุณสามารถแก้ไขข้อโต้แย้งของ gluLookAt เพื่อให้กล้องมองไปตามทิศทาง z ในกรณีนั้น z ควรคงที่ในนิยามกำลังสองของคุณ

ดูที่ http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml .

person Jasper    schedule 01.12.2013