คำถามติดแท็ก transformation

การเปลี่ยนแปลงในการพัฒนาเกมมักจะหมายถึงการดำเนินการพีชคณิตเชิงเส้นเกี่ยวกับจุดเวกเตอร์และเมทริกซ์

9
ทำไมเราถึงย้ายโลกแทนกล้อง
ฉันได้ยินมาว่าในเกม OpenGL สิ่งที่เราทำเพื่อให้ผู้เล่นเคลื่อนไหวไม่ใช่เพื่อขยับกล้อง แต่เพื่อเคลื่อนย้ายโลกทั้งใบ ตัวอย่างเช่นที่นี่เป็นส่วนหนึ่งของบทช่วยสอนนี้: OpenGL View matrix ในชีวิตจริงคุณคุ้นเคยกับการขยับกล้องเพื่อเปลี่ยนมุมมองของฉากหนึ่งใน OpenGL มันเป็นอีกมุมหนึ่ง กล้องใน OpenGL ไม่สามารถเคลื่อนที่ได้และกำหนดให้อยู่ที่ (0,0,0) หันทิศทาง Z เป็นลบ นั่นหมายความว่าแทนที่จะขยับและหมุนกล้องโลกจะถูกขยับและหมุนไปรอบ ๆ กล้องเพื่อสร้างมุมมองที่เหมาะสม ทำไมเราทำเช่นนั้น?

2
ฉันกำลังหมุนวัตถุบนสองแกนดังนั้นทำไมมันหมุนรอบแกนที่สามต่อไป?
ฉันเห็นคำถามเกิดขึ้นบ่อยครั้งที่มีปัญหาพื้นฐานนี้ แต่ทุกคำถามล้วนแล้วแต่เกี่ยวข้องกับคุณลักษณะหรือเครื่องมือที่กำหนด นี่คือความพยายามในการสร้างคำตอบที่ยอมรับได้ซึ่งเราสามารถอ้างถึงผู้ใช้เมื่อเกิดเหตุการณ์นี้ขึ้น - ด้วยตัวอย่างภาพเคลื่อนไหวมากมาย! :) สมมติว่าเรากำลังสร้างกล้องตัวแรก แนวคิดพื้นฐานคือควรหันเหมองไปทางซ้ายและขวา ดังนั้นเราจึงเขียนโค้ดแบบนี้ (ใช้ Unity เป็นตัวอย่าง): void Update() { float speed = lookSpeed * Time.deltaTime; // Yaw around the y axis using the player's horizontal input. transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f); // Pitch around the x axis using the player's vertical input. transform.Rotate(-Input.GetAxis("Vertical") * …

2
ใช้ Quaternions: ฉันจะทำอะไรกับพวกเขา? (ไม่มีคณิตศาสตร์)
ฉันเป็นนักพัฒนาเกมและไม่ได้เรียนวิชาคณิตศาสตร์ ดังนั้นฉันต้องการใช้ Quaternions เป็นเครื่องมือเท่านั้น และเพื่อให้สามารถทำงานกับการหมุน 3 มิติได้จำเป็นต้องใช้ Quaternions (หรือเมทริกซ์ แต่ให้อยู่ที่ Quaternions ที่นี่ในคำถามนี้) ฉันคิดว่ามันสำคัญสำหรับนักพัฒนาหลายคนที่จะใช้พวกเขา นั่นเป็นเหตุผลที่ฉันต้องการแบ่งปันความรู้ของฉันและหวังว่าจะเติมเต็มช่องว่างที่ฉันมี ตอนนี้ .... เท่าที่ฉันเข้าใจ: Quaternion สามารถอธิบาย 2 สิ่ง: การวางแนวปัจจุบันของวัตถุ 3 มิติ การแปลงการหมุนที่วัตถุทำได้ (rotationChange) คุณสามารถทำอะไรกับ Quaternion: คูณ: Quaternion endOrientation = การหมุน QuaternionChange * Quaternion currentOrientation; ตัวอย่างเช่น: วัตถุ 3 มิติของฉันหันไปทางซ้าย 90 องศา - และการหมุนของฉันฉันคูณคือการหมุน 180 องศาไปทางขวาในที่สุดวัตถุ 3 มิติของฉัน 90 …

2
การเคลื่อนไหวนั้นขึ้นอยู่กับอัตราเฟรมแม้จะใช้ Time.deltaTime
ฉันมีรหัสต่อไปนี้เพื่อคำนวณการแปลที่จำเป็นในการย้ายวัตถุเกมใน Unity ซึ่งเรียกว่าLateUpdateมา จากสิ่งที่ฉันเข้าใจการใช้งานของฉันTime.deltaTimeควรจะทำให้เป็นอิสระแปลสุดท้ายอัตราเฟรม (โปรดทราบCollisionDetection.Move()เป็นเพียงการแสดง raycasts) public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If …

2
ทำไมเราต้องการพิกัดที่สี่เพื่อหารด้วย z
ฉันอ่านคำตอบที่นี่: กราฟิกการ์ดทำหน้าที่อย่างไรกับองค์ประกอบที่สี่ของเวกเตอร์เป็นตำแหน่งสุดท้าย "องค์ประกอบที่สี่เป็นกลอุบายในการติดตามการฉายภาพเปอร์สเปคทีฟเมื่อคุณฉายภาพเปอร์สเปคทีฟคุณต้องการหารด้วย z: x '= x / z, y' = y / z แต่นี่ไม่ใช่การดำเนินการที่ สามารถดำเนินการได้โดยเมทริกซ์ 3x3 ที่ทำงานบนเวกเตอร์ของ x, y, z เคล็ดลับที่กลายเป็นมาตรฐานสำหรับการทำเช่นนี้คือการผนวกพิกัดที่สี่, w, และประกาศว่า x, y, z จะถูกหารด้วย w เสมอ หลังจากการแปลงทั้งหมดถูกนำไปใช้และก่อนการแรสเตอร์ แต่ฉันไม่เข้าใจว่าทำไมเราจึงหารด้วย z ด้วยเมทริกซ์ 3x3 ไม่ได้? เราไม่สามารถคูณด้วย 1/z 0 0 0 1/z 0 0 0 1/z เพื่อรับ [x/z y/z 1] …

2
ปัญหาล็อก gimbal ถูกแก้ไขได้อย่างไรโดยใช้การแปลงเมทริกซ์แบบสะสม
ฉันกำลังอ่านหนังสือ "การเรียนรู้การเขียนโปรแกรมกราฟิก 3D สมัยใหม่" โดย Jason L. McKesson ณ ตอนนี้ฉันถึงปัญหาล็อก gimbal และวิธีแก้ปัญหาโดยใช้ quaternions แต่ที่นี่ที่หน้า Quaternions ส่วนหนึ่งของปัญหาคือเรากำลังพยายามเก็บการปฐมนิเทศเป็นชุดของการหมุนแกนสะสม 3 ชุด การวางแนวคือการหมุนไม่ใช่การหมุน และทิศทางไม่แน่นอนชุดของการหมุน ดังนั้นเราต้องปฏิบัติต่อการวางแนวของเรือในฐานะการปฐมนิเทศตามปริมาณที่กำหนด ฉันเดาว่านี่เป็นจุดแรกที่ฉันเริ่มสับสนเพราะฉันไม่เห็นความแตกต่างอย่างมากระหว่างการหมุนและการหมุน ฉันยังไม่เข้าใจว่าทำไมการปฐมนิเทศจึงไม่สามารถแสดงเป็นชุดการหมุนได้ ... นอกจากนี้: ความคิดแรกเกี่ยวกับจุดประสงค์นี้คือเพื่อให้การปฐมนิเทศเป็นเมทริกซ์ เมื่อเวลานั้นมาถึงการปรับเปลี่ยนการปฐมนิเทศเราเพียงแค่นำการแปลงไปใช้กับเมทริกซ์นี้โดยจัดเก็บผลลัพธ์เป็นทิศทางปัจจุบันใหม่ ซึ่งหมายความว่าทุก ๆ yaw pitch และ roll ที่ใช้กับการวางแนวปัจจุบันจะสัมพันธ์กับการวางแนวปัจจุบันนั้น ซึ่งเป็นสิ่งที่เราต้องการอย่างแม่นยำ หากผู้ใช้ใช้การหันเหที่เป็นบวกคุณต้องการให้หันเหที่จะหมุนพวกเขาเมื่อเทียบกับที่พวกเขากำลังชี้ปัจจุบันไม่ได้เกี่ยวข้องกับระบบพิกัดคงที่บางส่วน แนวคิดฉันเข้าใจ แต่ฉันไม่เข้าใจว่าการสะสมการแปลงเมทริกซ์เป็นวิธีแก้ปัญหานี้ได้อย่างไรรหัสที่ให้ในหน้าก่อนหน้านั้นไม่ใช่แค่นั้น นี่คือรหัส: void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); …

2
วิธีการแยกมุมออยเลอร์จากเมทริกซ์การแปลง?
ฉันมีความเข้าใจง่าย ๆ เกี่ยวกับเอ็นจิ้นเกมเอนทิตี / องค์ประกอบ องค์ประกอบการแปลงมีวิธีการในการกำหนดตำแหน่งท้องถิ่นการหมุนในท้องถิ่นตำแหน่งทั่วโลกและการหมุนทั่วโลก หากการแปลงกำลังถูกกำหนดตำแหน่งใหม่ระดับโลกดังนั้นตำแหน่งในท้องถิ่นก็จะเปลี่ยนแปลงเช่นกันเพื่ออัปเดตตำแหน่งในกรณีเช่นนี้ฉันแค่ใช้การแปลงเมทริกซ์โลคอลปัจจุบันไปยังเมทริกซ์การแปลงของผู้ปกครอง ก่อนหน้านี้ฉันไม่มีปัญหาฉันสามารถรับเมทริกซ์การแปลงเฉพาะที่ได้ แต่ฉันกำลังดิ้นรนกับวิธีอัปเดตตำแหน่งในท้องถิ่นและค่าการหมุนในการแปลงสภาพ ทางออกเดียวที่ฉันมีในใจคือการแยกค่าการแปลและการหมุนจาก localMatrix ของการแปลง สำหรับการแปลมันค่อนข้างง่าย - ฉันแค่เอาค่าคอลัมน์ที่ 4 แต่การหมุนคืออะไร วิธีการแยกมุมออยเลอร์จากเมทริกซ์การแปลง? วิธีแก้ปัญหานั้นถูกต้องหรือไม่: เพื่อหาการหมุนรอบแกน Z เราสามารถหาความแตกต่างระหว่างเวกเตอร์แกน X ของ localTransform และเวกเตอร์แกน X ของ parent.localTransform และเก็บผลลัพธ์ในเดลต้าแล้ว: localRotation.z = atan2 (Delta.y, Delta .x); เช่นเดียวกับการหมุนรอบ X & Y เพียงแค่ต้องสลับแกน

1
ทฤษฎีสัมพัทธภาพพิเศษใน GLSL
ฉันพยายามใช้ GLSL shader ซึ่งช่วยทำความเข้าใจสัมพัทธภาพพิเศษ Lorentz Transformation ลองมาสองแกนชิดสังเกตการณ์เฉื่อย และO O'ผู้สังเกตการณ์O'อยู่ในการเคลื่อนไหวสังเกตการณ์ WRT ด้วยความเร็วOv=(v_x,0,0) เมื่ออธิบายในแง่ของO'พิกัดเหตุการณ์P' = (x',y',z',ct')จะเปลี่ยนพิกัด(x,y,z,ct)= L (x',y',z',ct') โดยที่ L เป็นเมทริกซ์ 4x4 ที่เรียกว่าการแปลงแบบลอเรนซ์ซึ่งช่วยให้เราเขียนพิกัดของเหตุการณ์ P 'ในOพิกัด (สำหรับรายละเอียดดูhttp://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction ) ฉันได้เขียน Shader Vertex เบื้องต้นตัวแรกที่ใช้การแปลงแบบลอเรนซ์ที่กำหนดความเร็วให้กับทุกจุดสุดยอด แต่ฉันไม่สามารถทำให้การแปลงทำงานได้อย่างถูกต้อง vec3 beta= vec3(0.5,0.0,0.0); float b2 = (beta.x*beta.x + beta.y*beta.y + beta.z*beta.z )+1E-12; float g=1.0/(sqrt(abs(1.0-b2))+1E-12); // Lorentz factor (boost) float q=(g-1.0)/b2; …

2
คุณจะแยกการวางแนวจากเมทริกซ์การแปลงได้อย่างไร?
ฉันมีเมทริกซ์การแปลง 4x4 M และฉันต้องการค้นหารูปร่างของทรงกลมเมื่อเปลี่ยนโดย M (ทรงกลมอยู่ที่จุดกำเนิดและมีรัศมี 1) ฉันรู้ว่าฉันสามารถหาจุดศูนย์กลางได้โดยการคูณ M ด้วย (0,0,0,1) อย่างไรก็ตามรัศมีกลายเป็นปัญหาเนื่องจาก M สามารถบีบและหมุนทรงกลมได้ ฉันจะทราบรัศมีใหม่ของทรงรีที่เกิดขึ้นได้อย่างไร มีวิธีใดบ้างในการค้นหาการปฐมนิเทศ? โดยเฉพาะอย่างยิ่งฉันจำเป็นต้องรู้ขนาดของทรงกลมที่มีขอบเขตซึ่งจะล้อมรอบทรงกลมที่ถูกเปลี่ยนรูป กล่าวอีกนัยหนึ่งค่าสูงสุดคืออะไร | M * V - M * (0,0,0,1) | โดยที่ V คือเวกเตอร์หน่วย (จุดบนทรงกลมดั้งเดิม)

5
ทำไมฉันไม่สามารถใช้โอเปอเรเตอร์ '> =' กับ Vector3s ได้
ฉันพยายามที่จะได้รับรูปสี่เหลี่ยมผืนผ้าย้ายไปมาระหว่างสองตำแหน่งที่ผมพูดถึงและ_positionA ทั้งสองประเภท_positionB Vector3สี่เหลี่ยมผืนผ้าเคลื่อนไหวได้ดี อย่างไรก็ตามเมื่อมันมาถึง_positionBมันจะไม่เคลื่อนที่ในทิศทางตรงกันข้ามเหมือนอย่างที่ควร ฉันกลับไปที่โค้ดเพื่อดู ฉันมาถึงข้อสรุปว่าเป็นวัตถุย้ายที่ifงบในรหัสพลาดเฟรมซึ่งในตำแหน่ง rects _positionBเท่ากับ ฉันตัดสินใจที่จะปรับเปลี่ยนรหัสไปในทิศทางที่ตรงกันข้ามถ้าตำแหน่ง rects คือมากกว่าหรือเท่ากับ _positionBรหัสของฉันไม่ยาวเกินไปดังนั้นฉันจะแสดงด้านล่าง: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

4
การแปลงรูปทรงเรขาคณิตบน CPU vs GPU
ฉันได้สังเกตเห็นว่าโปรแกรม 3d หลายทำตามปกติเวกเตอร์การคำนวณ / เมทริกซ์เช่นเดียวกับการแปลงทางเรขาคณิตบน CPU มีใครพบความได้เปรียบในการเคลื่อนย้ายการคำนวณเหล่านี้เป็น shaders จุดสุดยอดใน GPU หรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.