รูปร่างที่ซับซ้อนใน SceneKit

ใน SceneKit โปรแกรมเมอร์อาจสร้างโหนด/อ็อบเจ็กต์โดยการป้อนโค้ดต่อไปนี้:

SCNBox* box = [SCNBox boxWithWidth:1 height:1 length:1 chamferRadius:0.1]; // define a geometry
SCNNode* boxNode = [SCNNode nodeWithGeometry:box]; // make this geometry into a 3D node
[scene.rootNode addChildNode:boxNode]; // add the node into the scene

และคุณจะได้กล่องโหนดซึ่งวัดได้ 1x1x1 หน่วย โดยมีรัศมีการลบมุม 0.1 มีลักษณะเกือบเป็นวงกลม

กล่อง

อย่างไรก็ตาม ฉันต้องการแสดงรูปร่างที่ซับซ้อนมากกว่ากล่อง ทรงกลม หรือทรงกระบอก ตัวอย่างเช่น ฉันต้องการแสดงชิ้นส่วนปริศนาบนหน้าจอ

ฉันจะทำอย่างนั้นได้อย่างไร? ฉันรู้ว่ามันเป็นไปได้โดยการกำหนด SCNShape ด้วยเส้นโค้งเบซิเยร์ (ร่วมกับ NSBezierCurve) หากฉันต้องการโหลดชุดของจุดยอดลงในเรขาคณิตและให้มันเป็นวัสดุ ฉันจะทำอย่างไร

ฉันยังใหม่กับการเขียนโปรแกรม 3D ฉันเคยยุ่งกับทรงกลมและรูปทรงที่เรียบง่ายมาก่อน ฉันอาจจะสร้างชิ้นส่วนปริศนาเรนเดอร์บนหน้าจอด้วยวิธีที่ไม่ถูกต้อง


person DDPWNAGE    schedule 22.10.2015    source แหล่งที่มา


คำตอบ (1)


ปัจจุบัน Scene Kit ใช้สำหรับเรนเดอร์เรขาคณิตเท่านั้น และมีเครื่องมือสร้างเรขาคณิตที่จำกัดมาก แม้ว่าการเปิดตัว Model I/O ดูเหมือนจะเป็นก้าวแรกในการรองรับความสามารถในการสร้างแบบจำลอง 3 มิติที่ซับซ้อนยิ่งขึ้น

คุณพูดถูกแล้วว่าสำหรับรูปร่างธรรมดา คุณสามารถใช้ Scene Kit รูปทรงพื้นฐาน (กล่อง ทรงกลม ฯลฯ) หรือ SCNShape ที่มี NSBezierCurve สำหรับการอัดขึ้นรูป 3 มิติที่มีมุมเอียงและการลบมุม สำหรับรูปทรงที่ซับซ้อนมากขึ้น คุณมีทางเลือก 2-3 ทาง:

ซอฟต์แวร์สร้างแบบจำลอง 3 มิติของบุคคลที่สาม สามารถใช้เพื่อสร้างรูปทรงเรขาคณิต และในบางกรณี ภาพเคลื่อนไหวที่สามารถนำเข้าสู่ Scene Kit ได้โดยตรง ดูเหมือนว่าหลายๆ คนจะใช้ Sketchup เพราะมันฟรีและใช้งานง่าย เหมาะสำหรับรูปร่างพื้นฐานแต่มีความสามารถจำกัดมาก ฉันขอแนะนำให้ใช้ Blender ซึ่งใช้งานได้ฟรีแต่มีอย่างอื่นอีกมากมายในการสร้างรูปทรงเรขาคณิตและตาข่าย และยังช่วยให้คุณสร้างภาพเคลื่อนไหวและวัสดุที่สามารถนำเข้าได้โดยตรง มันมีช่วงการเรียนรู้ที่สูงชัน แต่เมื่อคุณถอดรหัสได้แล้ว มันก็เป็นทรัพย์สินที่ดีที่จะมี

ซอฟต์แวร์ประเภทนี้เหมาะที่สุดสำหรับรูปทรงเรขาคณิตที่ซับซ้อน เช่น ระดับ ตัวละคร และทิวทัศน์ แต่ก็มีข้อเสียคือค่อนข้างไม่ไดนามิกเมื่อนำเข้า เนื่องจากทุกตาข่ายจะมีลักษณะเหมือนกัน ตัวอย่างเช่น หากคุณสร้างหินเป็นทิวทัศน์ คุณจะต้องสร้างหินหลากหลายรูปแบบ หรือ ทำให้ทุกหินในเกมของคุณดูเหมือนกัน

สร้างใน Scene Kit โดยใช้คลาส SCNGeometrySource และ SCNGeometryElement โดยพื้นฐานแล้วสิ่งเหล่านี้คือชุดของจุดในพื้นที่ 3 มิติ (แต่ละจุด SCNVector3) ที่กำหนดมุมหรือจุดยอดของเมชของคุณ จากนั้นคุณรวมจุดเหล่านั้นเข้าด้วยกันเป็นตาข่ายโดยใส่คะแนนของคุณลงในอาร์เรย์และกำหนดว่าจุดใดควรนำมารวมกันเพื่อสร้างสามเหลี่ยมหรือองค์ประกอบของตาข่ายของคุณ สิ่งนี้ถูกกำหนดให้เป็นอาร์เรย์อีกชุดหนึ่งของเวกเตอร์ SCNVector3 โดยที่แต่ละส่วนของเวกเตอร์ชี้ไปที่ดัชนีในอาร์เรย์ของจุดยอด เวกเตอร์ของ [0, 1, 2] จะสร้างสามเหลี่ยมจากจุดในดัชนีอาร์เรย์ 0, 1 และ 2 มี บทช่วยสอนเกี่ยวกับวิธีการทำเช่นนี้

ประโยชน์ของสิ่งนี้คือความสามารถในการสร้างเรขาคณิตแบบสุ่ม โดยการสร้างชุดจุดสุ่มเทียมแล้วรวมเข้าด้วยกันเพื่อสร้างตาข่ายของคุณ จากนี้ คุณสามารถอบการบดบังแสงโดยรอบได้โดยใช้ Model I/O (สมมติว่า Apple ได้แก้ไขปัญหานี้แล้ว ฉันยังไม่ได้ตรวจสอบ) และใช้ Model I/O ต่อไปเพื่อสร้างวัสดุที่ค่อนข้างสมจริง หมายความว่าคุณสามารถสร้างสิ่งที่คุณต้องการได้อย่างมีประสิทธิภาพ ต่อจากตัวอย่างก่อนหน้านี้ คุณสามารถสร้างหินที่ดูแตกต่างออกไปตามขั้นตอนได้ คุณสามารถใช้สิ่งนี้เพื่อสร้างความเป็นไปได้ของชิ้นส่วนปริศนาจำนวนไม่สิ้นสุด

ตามที่ทราบด้านข้าง เรขาคณิตและวัสดุเป็นสองสิ่งที่แตกต่างกันในการสร้างแบบจำลอง 3 มิติ และเมื่อคุณเพิ่งเริ่มต้น ดูเหมือนว่าคำถามของคุณจะปะปนกัน เรขาคณิตคือตาข่ายที่กำหนดรูปร่างของวัตถุ และวัสดุจะกำหนดวิธีที่แสงมีปฏิกิริยากับตาข่ายนั้นเพื่อสร้างรูปลักษณ์ขั้นสุดท้าย รูปทรงเรขาคณิตสามารถมีวัสดุอย่างน้อยหนึ่งชิ้นติดอยู่เพื่อให้ได้ผลลัพธ์ที่คุณต้องการ

ตัวเลือกที่คุณเลือกนั้นขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุจริงๆ สำหรับการสุ่ม ตัวเลือกที่สองจะดีกว่า สำหรับคุณภาพ ตัวเลือกแรกจะดีที่สุด ฉันรู้สึกอึดอัดนิดหน่อยตอนนี้เลยขอจบแค่นี้

person Andy Heard    schedule 22.10.2015
comment
ขอบคุณสำหรับคำตอบโดยละเอียด! ฉันมีเพื่อนที่รู้วิธีใช้ Blender แต่ฉันอยากรู้ว่าฉันสามารถใช้ SceneKit เพื่อสร้างโมเดลตามจุด 3D ได้หรือไม่ ฉันไม่รู้เกี่ยวกับชั้นเรียนที่คุณพูดถึง นั่นจะช่วยได้มาก! ???? - person DDPWNAGE; 22.10.2015