คำถามติดแท็ก scene-graph

1
กลิ้งกราฟฉากของฉันเอง
สวัสดีการพัฒนาเกม SE! ฉันคลานผ่าน OpenGL ด้วยความหวังในการสร้างเอ็นจิ้นเกมที่เรียบง่ายและมีน้ำหนักเบามาก ฉันมองว่าโครงการนี้เป็นประสบการณ์การเรียนรู้ที่อาจสร้างรายได้เพียงเล็กน้อยในตอนท้าย แต่จะสนุกด้วยวิธีใดวิธีหนึ่ง จนถึงตอนนี้ฉันใช้ GLFW เพื่อรับ I / O พื้นฐาน, หน้าต่าง (ด้วยคีย์เต็มหน้าจอ F11 ที่สวยงามมาก) และแน่นอนว่าเป็นบริบทของ OpenGL ฉันยังใช้ GLEW เพื่อแสดงส่วนขยาย OpenGL ที่เหลือเนื่องจากฉันใช้ Windows และฉันต้องการใช้ OpenGL 3.0 ขึ้นไปทั้งหมด ซึ่งพาฉันไปที่กราฟของฉาก ในระยะสั้นฉันต้องการที่จะม้วนของตัวเอง การตัดสินใจครั้งนี้เกิดขึ้นหลังจากได้ดู OSG และอ่านบทความสองสามฉบับเกี่ยวกับวิธีที่แนวคิดของกราฟฉากกลายเป็นบิดงอและหัก หนึ่งบทความดังกล่าวอธิบายว่ากราฟฉากได้พัฒนาเป็น ... จากนั้นเราเพิ่มสิ่งพิเศษทั้งหมดนี้เข้าไปเช่นเครื่องประดับที่แขวนอยู่บนต้นคริสต์มาสยกเว้นว่าเครื่องประดับบางชิ้นเป็นสเต็กที่ชุ่มฉ่ำและบางส่วนก็เป็นวัวที่ยังมีชีวิตอยู่ ตามการเปรียบเทียบฉันต้องการสเต็กเนื้อของกราฟฉากควรเป็นอะไรโดยไม่ต้องใส่สายรหัสพิเศษหรือวัวทั้งหมด ดังนั้นในใจฉันพบว่าตัวเองสงสัยว่ากราฟซีนควรเป็นอะไรและควรใช้กราฟฉากง่าย ๆ อย่างไร? นี่คือสิ่งที่ฉันมี ... ผู้ปกครองหนึ่งคนต้นไม้ n-children หรือ DAG ซึ่ง ... …
23 opengl  3d  scene-graph 

7
วิธีหลีกเลี่ยงวัตถุเกมลบโดยไม่ตั้งใจใน C ++
สมมติว่าเกมของฉันมีสัตว์ประหลาดที่สามารถโจมตีได้ด้วยระเบิด เรามาเลือกชื่อสัตว์ประหลาดตัวนี้แบบสุ่ม: Creeper ดังนั้นCreeperคลาสมีวิธีการที่มีลักษณะดังนี้: void Creeper::kamikaze() { EventSystem::postEvent(ENTITY_DEATH, this); Explosion* e = new Explosion; e->setLocation(this->location()); this->world->addEntity(e); } เหตุการณ์ไม่ได้เข้าคิวพวกเขาจะถูกส่งทันที ซึ่งทำให้วัตถุที่จะได้รับการลบบางภายในการเรียกร้องให้Creeper postEventบางสิ่งเช่นนี้ void World::handleEvent(int type, void* context) { if(type == ENTITY_DEATH){ Entity* ent = dynamic_cast<Entity*>(context); removeEntity(ent); delete ent; } } เพราะCreeperวัตถุที่ได้รับการลบในขณะที่วิธีการที่จะยังคงทำงานก็จะมีปัญหาเมื่อพยายามที่จะเข้าถึงkamikazethis->location() ทางออกหนึ่งคือการจัดคิวเหตุการณ์ลงในบัฟเฟอร์และส่งต่อในภายหลัง นั่นเป็นวิธีแก้ปัญหาทั่วไปในเกม C ++ ใช่ไหม รู้สึกเหมือนแฮ็คสักหน่อย แต่นั่นอาจเป็นเพราะประสบการณ์ของฉันกับภาษาอื่นที่มีการจัดการหน่วยความจำที่แตกต่างกัน ใน C ++ มีวิธีแก้ปัญหาทั่วไปที่ดีกว่าสำหรับปัญหานี้หรือไม่ที่วัตถุจะลบตัวเองออกจากภายในหนึ่งในวิธีการใด …
20 c++  scene-graph 

1
กราฟฉากในเธรดแยกกัน
ฉันพัฒนาโปรแกรมเกมของตัวเองเพื่อความสนุก (แต่ไม่หวังผลกำไร) ฉันมีการแสดงผลในหนึ่งเธรดและกราฟฉากของฉันอัปเดต (ความเร็ว ฯลฯ ) ในอีกอันหนึ่ง เมื่อถึงเวลาที่จะแสดงผลเธรดการแสดงผลจะเพิ่มโหนดที่มองเห็นให้กับบัฟเฟอร์เชิงเส้นใหม่และข้ามไป รายละเอียดเพิ่มเติมกราฟฉากของฉันถูกแบ่งเป็นสามส่วน แต่ละโหนดในกราฟฉากของฉันมีสามชุดของเมทริกซ์การแปลงแบบสัมพัทธ์และสัมบูรณ์ (4x4) ณ เวลาใดเวลาหนึ่งจะมีการคัดลอกหนึ่งชุดโดยเธรดกราฟฉากหนึ่งชุดจะถูกอ่านโดย renderer และชุดที่สามมีอยู่เพื่อให้ผู้อ่านหรือนักเขียนสามารถย้ายไปยังหน้าถัดไปได้โดยไม่ต้องรออีกชุดหนึ่ง สิ่งนี้จะช่วยป้องกันการเขียนไปยังบางสิ่งในขณะที่กำลังแสดงผลและจากการแสดงกราฟฉากที่อัปเดตครึ่ง ยังไงก็เถอะฉันก็ได้สำเนาที่สี่ของแต่ละเมทริกซ์เพื่อให้ผู้ใช้ทำงานด้วยเพื่อไม่ให้ขัดแย้งกับเธรดการอัพเดต ดูเหมือนว่าจะทำงานได้ดีโดยหลีกเลี่ยงการซิงโครไนซ์ตลอดเวลา อย่างไรก็ตามนี่เป็นระเบียบ นี่คือเป้าหมายสูงสุดของฉันสำหรับระบบ: กราฟแสดงผลและการอัปเดตจะอยู่ในชุดข้อความแยกกัน ลดจำนวนเธรดเหล่านี้ให้เล็กลง อย่าแสดงฉากที่ได้รับการอัปเดตครึ่งทางโดยชุดอัพเดท สิ่งนี้จะสังเกตเห็นได้ชัดเจนเป็นพิเศษหากกล้องกำลังเคลื่อนไหวอย่างรวดเร็วและบางครั้งก็แสดงผลก่อนหรือหลังการอัพเดต การใช้งานหน่วยความจำลดลง ฉันมีเมทริกซ์ต่อโหนดมากเกินไป ฉันกำลังพิจารณาที่จะย้ายไปที่เวกเตอร์สำหรับตำแหน่ง / การหมุน / มาตราส่วนเนื่องจากการเพิ่มจุดลอยตัวด้วยเมทริกซ์ ความสามารถในการจัดการหมื่นโหนด ระบบปัจจุบันทำได้ดีพอสมควร ฉันหวังว่าจะรวม Bullet (เอนจิ้นฟิสิกส์) และการสร้างเครือข่ายในอนาคตซึ่งฉันไม่ได้คิดมาก มีวิธีใดบ้างที่จะทำให้กราฟซีนดีขึ้น

2
ฉันจะมองเห็นการเปลี่ยนแปลงที่เกิดขึ้นกับฉากได้อย่างไรตั้งแต่คอมไพล์ล่าสุดส่งมอบ
ฉันต้องการดูการเปลี่ยนแปลงที่เกิดขึ้นในฉาก (ไฟล์. unity) ก่อนที่จะส่งไปคอมไพล์ ฉันได้ดูโซลูชัน GIT / Unity หลายอย่าง แต่ทั้งหมดนี้ทำเพื่อรวมการเปลี่ยนแปลงและไม่แสดงความแตกต่างกับรุ่นล่าสุด ปัญหาเกี่ยวกับไฟล์ซีนคือพวกเขาใช้ GUID ที่ชี้ไปที่สินทรัพย์อื่นและเมื่อฉันเปิดไฟล์ diff สำหรับไฟล์ซีนฉันไม่สามารถทำอะไรออกมาได้เลย ตัวอย่างเช่น: แต่ฉันต้องการเห็นสิ่งนี้: มีอะไรอีกไหมที่ทำสิ่งนี้?

1
วิธีแคชทรัพยากรในระบบการแสดงผล homebrew ของฉัน
พื้นหลัง: ฉันกำลังออกแบบระบบการเรนเดอร์ 3D แบบง่ายสำหรับสถาปัตยกรรมชนิดเอนทิตีคอมโพเนนต์โดยใช้ C ++ และ OpenGL ระบบประกอบด้วย renderer และกราฟฉาก เมื่อฉันเสร็จสิ้นการทำซ้ำครั้งแรกของโหมดแสดงภาพฉันอาจกระจายกราฟฉากลงในสถาปัตยกรรม ECS สำหรับตอนนี้มันเป็นตัวยึดตำแหน่งทางเดียวหรืออื่น หากเป็นไปได้ต่อไปนี้เป็นเป้าหมายของฉันสำหรับผู้สร้างภาพ: ความง่าย นี่เป็นโครงการวิจัยและฉันต้องการที่จะสามารถเปลี่ยนแปลงและขยายระบบของฉันได้อย่างง่ายดาย (ด้วยวิธีการของ ECS) การปฏิบัติ ฉากของฉันอาจมีนางแบบขนาดเล็กจำนวนมากและยังมีเล่มขนาดใหญ่ที่มีรูปทรงเรขาคณิตมากมาย ไม่สามารถรับวัตถุจากบริบท OGL และเรขาคณิตบัฟเฟอร์ทุกเฟรมการเรนเดอร์ ฉันตั้งเป้าหมายในการหาที่ตั้งของข้อมูลเพื่อหลีกเลี่ยงการพลาดแคช มีความยืดหยุ่น มันจะต้องสามารถแสดงสไปรต์โมเดลและโวลุ่ม (voxels) แยกออก กราฟฉากอาจถูก refactored ลงในสถาปัตยกรรมหลักของ ECS หลังจากที่ฉันเขียน renderer ของฉัน modular เป็นเรื่องดีที่สามารถสลับในโหมดแสดงภาพที่ต่างกันได้โดยไม่ต้องเปลี่ยนกราฟฉากของฉัน ความโปร่งใสอ้างอิงซึ่งหมายความว่า ณ เวลาใด ๆ ฉันสามารถให้มันถูกต้องฉากใด ๆ และมันจะทำให้ภาพเดียวกันสำหรับฉากนั้น โดยเฉพาะอย่างยิ่งเป้าหมายนี้ไม่จำเป็นต้องมี ฉันคิดว่ามันจะช่วยทำให้การจัดลำดับฉากเป็นเรื่องง่ายขึ้น (ฉันจะต้องสามารถบันทึกและโหลดฉาก) และให้ความยืดหยุ่นในการสลับฉากต่าง ๆ …

1
ไปป์ไลน์การแสดงผลของเครื่องยนต์
ฉันพยายามสร้างเอ็นจิ้นเกม 2D โดยใช้ OpenGL ES 2.0 (iOS สำหรับตอนนี้) ฉันได้เขียนเลเยอร์แอปพลิเคชันใน Objective C และแยกตัวเองบรรจุ RendererGLES20 ใน C ++ ไม่มีการโทรเฉพาะ GL นอกสายแสดงภาพ มันทำงานได้อย่างสมบูรณ์ แต่ฉันมีปัญหาการออกแบบเมื่อใช้ shaders Shader แต่ละตัวมีคุณสมบัติและเครื่องแบบที่เป็นเอกลักษณ์ของตัวเองซึ่งจำเป็นต้องตั้งค่าก่อนการเรียกสายหลัก (glDrawArrays ในกรณีนี้) ตัวอย่างเช่นในการวาดรูปทรงเรขาคณิตฉันจะทำ: void RendererGLES20::render(Model * model) { // Set a bunch of uniforms glUniformMatrix4fv(.......); // Enable specific attributes, can be many glEnableVertexAttribArray(......); // Set a …

1
กราฟฉากหรือไม่กราฟฉาก?
ฉันดิ้นรนกับการตัดสินใจว่าจะใช้กราฟฉากในเกมของฉันหรือไม่ ฉันมีกรณีการใช้งานบางอย่างที่เรียกใช้เครื่องมือดังกล่าว แต่ฉันไม่สามารถรับรายละเอียดการใช้งานบางอย่างได้ พื้นหลังบางอย่าง: ฉันกำลังเขียนเกมประเภท Shooter อวกาศที่กำหนดเป้าหมายไว้ที่แพลตฟอร์มมือถือ (Android เป็นหลัก) และรหัสของฉันคือ C ++ เกือบทั้งหมด ฉันไม่ได้ใช้มิดเดิลแวร์ใด ๆ เครื่องยนต์เรนเดอร์และฟิสิกส์โดยเฉพาะเป็นการสร้างของฉันเอง เอนจิ้นฟิสิกส์ของฉันอัพเดทตำแหน่งของวัตถุตามแรงและแรงกระตุ้น ฉันยังไม่มีระบบแอนิเมชั่นในขณะนี้ แต่อาจไปที่จุดนี้ (ซึ่งอาจจะหรือไม่มีอะไรเกี่ยวข้องกับการสนทนานี้) ก่อนอื่นฉันจะอธิบายกรณีใช้งานที่ดี ฉันต้องการมีเจ้านายที่ประกอบด้วยชิ้นส่วนแยกกันหลายส่วนซึ่งแต่ละชิ้นสามารถเสียหาย / ถูกทำลายได้อย่างอิสระ ตัวอย่างเช่นฉันอาจมีหัวหน้าที่มีแขนที่สามารถได้รับความเสียหายโดยอิสระจากเอนทิตีที่เหลือ เมื่อแขนถูกทำลายเอฟเฟกต์อนุภาคไฟที่ไหล่ของผู้บังคับบัญชาอาจบ่งบอกว่าตอนนี้แขนถูกทำลายแล้ว เนื่องจากเป็นฉันได้ตัดสินใจลองแก้ไขปัญหาดังกล่าวด้วยข้อ จำกัด ในเครื่องมือฟิสิกส์ของฉันเพื่อให้วัตถุผสมดังกล่าวเข้าด้วยกัน ข้อ จำกัด หนึ่งข้อนั้นให้อิสระ 0 องศาและเป็นเมทริกซ์การแปลง นี่เป็นความพยายามที่จะหลีกเลี่ยงปัญหาที่ในที่สุดก็ปิดฉันออกจากฉากกราฟในสถานที่แรกที่อธิบายไว้ด้านล่าง เหตุผลหลักที่ฉันหันหลังให้กับการใช้กราฟฉากก็เพราะฉันไม่สามารถหาวิธีที่มีประสิทธิภาพในการเก็บวัตถุที่ซ้อนกัน (วัตถุที่สืบทอดการเปลี่ยนแปลงจากผู้ปกครองของพวกเขา) ทั้งในโลกฟิสิกส์และฉากเรนเดอร์ โลกฟิสิกส์ต้องการวัตถุในอวกาศ (หรืออย่างน้อยพื้นที่เดียวกัน) ในขณะที่ฉากเรนเดอร์ต้องการวัตถุในพื้นที่แม่ การติดตามตำแหน่งในพื้นที่ทั้งสองอาจช่วย (และหลีกเลี่ยงไม่ได้) แต่ทำให้เกิดความกังวลของตัวเองไม่ใช่อย่างน้อยก็เกี่ยวข้องกับประสิทธิภาพ อย่างไรก็ตามจากกรณีการใช้งานอย่างที่อธิบายไว้ข้างต้นฉันคิดว่าการสามารถ 'ทำงาน' ในพื้นที่ผู้ปกครองจะกลายเป็นเรื่องสำคัญมากและพยายามบังคับให้กลไกฟิสิกส์ของฉันรักษาความสัมพันธ์เหล่านี้ผ่านการใช้ข้อ จำกัด ที่จะเป็นปัญหา จากกรณีการใช้งานและสถานการณ์ที่อธิบายไว้ข้างต้นฉันควรใช้โครงสร้างกราฟเพื่อส่งผ่านการแปลงจากวัตถุหนึ่งไปอีกวัตถุหนึ่งหรือไม่ …

2
สิ่งที่ควรมีอยู่ในกราฟฉากเกม
คุณช่วยฉันอธิบายได้ไหมว่าอะไรควรอยู่ในกราฟของเกม ดูรายการต่อไปนี้โปรด: นักแสดงเกม? (เห็นได้ชัดว่าใช่วัตถุที่เปลี่ยนสถานะทั้งหมดควรเป็นส่วนสำคัญของกราฟฉาก) เกมคงง่าย ojbects? (ฉันหมายถึงสถานที่ ojects ในพื้นหลังที่ไม่ได้รับภาพเคลื่อนไหวพวกเขาไม่ได้ชนกัน) ทริกเกอร์ของเกม ไฟของเกม กล้องเกม? กระสุนอาวุธ? การระเบิดของเกมและเทคนิคพิเศษ? วัตถุประเภทที่พิจารณาข้างต้น ตอนนี้ไปยังความครอบคลุมของกราฟฉาก: กราฟฉากควรมีแผนที่ระดับเกมทั้งหมดตั้งแต่ระดับเริ่มต้นหรือควรมีเฉพาะส่วนที่มองเห็นได้ของแผนที่? หากข้อที่สองเป็นจริงก็หมายความว่ากราฟฉากจะได้รับการอัปเดตอย่างต่อเนื่องโดยการเพิ่ม / ลบออบเจ็กต์เกมขณะที่ผู้เล่นย้าย อย่างไรก็ตามการมีเพียงสิ่งที่มองเห็นได้คือแผนที่จะเร็วกว่ามากในการสำรวจและอัปเดต

2
กราฟฉากสำหรับเครื่องยนต์การแสดงผลที่เลื่อนออกไป
ในฐานะที่เป็นแบบฝึกหัดการเรียนรู้ฉันได้เขียนเอนจิ้นการแสดงผลที่เลื่อนออกไป ตอนนี้ฉันต้องการเพิ่มกราฟฉากลงในเอ็นจิ้นนี้ แต่ฉันก็สับสนนิดหน่อยว่าจะทำอย่างไร ในเครื่องมือการเรนเดอร์ปกติ (forward render) ฉันจะเพิ่มรายการทั้งหมด (การใช้ IDrawable และ IUpdateAble) ไปยังกราฟฉากของฉันมากกว่าการเดินทางไปยังกราฟฉากกว้างก่อนและเรียก Draw () ทุกที่ อย่างไรก็ตามในเอนจินการเรนเดอร์ฉันต้องแยกสายการโทรออก ก่อนอื่นฉันต้องวาดรูปเรขาคณิตแล้วก็เงาล้อเลื่อนแล้วไฟ (ทั้งหมดไปยังเป้าหมายเรนเดอร์ต่าง ๆ ) ก่อนที่จะรวมมันทั้งหมด ดังนั้นในกรณีนี้ฉันไม่สามารถเดินทางผ่านกราฟฉากและเรียกวาดได้ วิธีที่ฉันเห็นมันฉันต้องเดินทางข้ามกราฟฉากทั้งหมด 3 ครั้งตรวจสอบว่ามันจะต้องวาดวัตถุชนิดใดหรือฉันต้องสร้างกราฟฉากแยกต่างหาก 3 ฉากที่เชื่อมต่อกัน ทั้งสองอย่างดูจะแก้ปัญหาได้ไม่ดีฉันต้องการจัดการกับวัตถุฉากให้โปร่งใสยิ่งขึ้น อีกวิธีหนึ่งที่ฉันคิดว่าจะเดินทางผ่านกราฟฉากเป็นเรื่องปกติและเพิ่มรายการลงใน 3 รายการแยกกันแยกเรขาคณิตลูกล้อเงาและแสงจากนั้นวนซ้ำรายการเหล่านี้เพื่อวาดสิ่งที่ถูกต้องดีกว่านี้หรือไม่ ฉลาดที่จะ repopulate 3 รายการทุกเฟรม?
10 xna  c#  scene-graph 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.