ไม่สามารถรับโมเดล 3 มิติที่มีพื้นผิวเพื่อแสดงได้อย่างถูกต้อง

ฉัน "พยายาม" เพื่อเรียนรู้ OpenGL โดยใช้หนังสือ "การเรียนรู้ OpenGL ES สำหรับ iOS: คู่มือเชิงปฏิบัติสำหรับการเขียนโปรแกรมกราฟิก 3D สมัยใหม่โดย Erik M. Buck"

ฉันมาถึงขั้นที่ฉันพยายามโหลดโมเดล 3 มิติในแอปทดสอบเพื่อยืนยันความรู้ของฉัน และแม้ว่าฉันจะสามารถแสดงโมเดลได้ แต่กลับปรากฏกลับด้านและพื้นผิวดูเหมือนเป็นส่วนหนึ่งที่แสดง (หรือแสดงไม่ถูกต้อง)

ฉันได้ลองใช้ GL_BLEND, GL_DEPTH_TEST โดยใช้ ortho โดยไม่ใช้ ortho โดยไม่เกิดประโยชน์และรู้ว่าฉันอาจขาดสิ่งสำคัญบางอย่างไป .. คิดว่าอาจเป็นอะไรที่เกี่ยวข้องกับใบหน้าปกติหรือเปล่า

นี่คือสิ่งที่ควรปรากฏ:

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือสิ่งที่ฉันได้รับ:

ป้อนคำอธิบายรูปภาพที่นี่ใครสามารถช่วยได้บ้าง

ขอบคุณ


person Piginhat    schedule 31.08.2013    source แหล่งที่มา
comment
นี่เป็นพื้นผิวจริงๆเหรอ? ดูเหมือนเป็นปัญหาการคัดแยกหน้าหลังสำหรับฉัน ลองปิดการใช้งานนั้น และลองกลับทิศทางการม้วนที่ถือว่าหันกลับ   -  person ClayMontgomery    schedule 01.09.2013
comment
ไม่แน่ใจว่าสิ่งที่ฉันทำคือใช้ข้อมูล obj ทรงกลมในตัวอย่างหนังสือเพื่อดูว่าฉันได้ผลลัพธ์อะไร และมันแสดงโลกด้วยพื้นผิวที่ใช้เหมือนในหนังสือ ฉันคิดว่าฉันทำถูกแล้ว ไม่เช่นนั้น Earth Sphere จะแสดงผลไม่ถูกต้องใช่ไหม แปลก. โดยพื้นฐานแล้วฉันกำลังใช้แอปตัวอย่างที่ฉันเขียนใหม่และแทนที่ทรงกลมโลก obj ด้วยวัตถุโมเลกุล ฉันได้ลองใช้กับตัวอย่างหนังสืออีกเล่มหนึ่งที่ใช้โมเดล 3 มิติที่สามารถหมุน แปล และปรับขนาดได้ ฯลฯ และตัวอย่างก็ใช้ได้ดี แต่เมื่อฉันพยายามนำวัตถุของตัวเองเข้ามา ฉันกลับพบการแสดงผลประเภทนี้   -  person Piginhat    schedule 01.09.2013
comment
ฉันสามารถโพสต์โครงการได้หากช่วยได้?   -  person Piginhat    schedule 01.09.2013


คำตอบ (2)


ฉันคิดว่าโค้ดสำหรับโมเดลทรงกลมของคุณอนุมานว่าการคัดแยกส่วนด้านหลังถูกปิดใช้งานหรือต้องมีทิศทางการม้วนที่ตรงกันข้าม (ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา) สำหรับแถบสามเหลี่ยม คุณควรพยายามเริ่มต้น OpenGL ES อย่างถูกต้องตามสิ่งที่โค้ดนั้นคาดหวัง ฉันจะลองสิ่งนี้:

gl.glDisable(GL10.GL_CULL_FACE);

OR

gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
gl.glCullFace(GL10.GL_BACK);

OR

gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CW);
gl.glCullFace(GL10.GL_BACK);

สำหรับข้อมูลเพิ่มเติม โปรดดู "รายละเอียดรูปหลายเหลี่ยม" ใน OpenGL Red Book บทที่ 2:

http://www.glprogramming.com/red/chapter02.html
person ClayMontgomery    schedule 01.09.2013
comment
สวัสดี ขอบคุณมากสำหรับความช่วยเหลือของคุณ ขอบคุณ! ฉันลองทำตามคำแนะนำของคุณแล้ว และมีการปรับปรุงบางอย่างที่อย่างน้อยสีก็ดูเหมือนจะถูกนำไปใช้กับส่วนที่ถูกต้องของแบบจำลอง นี่คือปิดการใช้งานใบหน้าคัดแยก [IMG]i41.tinypic.com/2i9366x.jpg[/ IMG] และนี่คือการใช้ frontface cw [IMG]i41.tinypic.com /fk19hk.jpg[/IMG] - person Piginhat; 01.09.2013
comment
ฉันเห็นทรงกลมคาดว่าจะมีระบบพิกัด glFrustumf หรือ glOrthof ดังนั้นการใช้ ortho เช่นนั้น self.baseEffect.transform.projectionMatrix = GLKMatrix4MakeOrtho(-0.5 *spectRatio, 0.5 *spectRatio, -0.5f, 0.5, -5.0, 5.0); ให้ [IMG]i43.tinypic.com/2a6ozds.jpg[/IMG] - person Piginhat; 01.09.2013

ผู้เขียนหนังสือเล่มนี้มองดูสิ่งนี้ให้ฉันและพบสิ่งต่อไปนี้:

โมเดล .obj สร้างขึ้นโดยใช้ "รูปสี่เหลี่ยม" ซึ่งเป็นรูปหลายเหลี่ยม 4 ด้าน แต่ OpenGL ES เรนเดอร์ได้เฉพาะจุด เส้น และสามเหลี่ยมเท่านั้น เป็นผลให้มีเพียงครึ่งหนึ่ง (1 สามเหลี่ยม) ของแต่ละรูปสี่เหลี่ยมเท่านั้นที่ถูกเรนเดอร์

การเปิดไฟล์ .obj ใน Blender และส่งออกโดยใช้รูปสามเหลี่ยมส่งผลให้จอแสดงผลปรากฏขึ้นอย่างถูกต้อง

ขอบคุณ Erik Buck ที่สละเวลาช่วยเหลือผู้อ่านคนหนึ่งของเขา และขอบคุณ @clayMontgomery เช่นกันสำหรับความช่วยเหลือของเขา ;-)

person Piginhat    schedule 03.09.2013