ฉันกำลังมองหาข้อมูลเชิงลึกเกี่ยวกับปัญหาเล็ก ๆ ด้วยการแปลหน่วยบนกริด
อัปเดตและแก้ไข
ฉันแก้ไขปัญหาของฉันเอง ดูรายละเอียดด้านล่าง ทุกอย่างในส่วนนี้ของโพสต์กลายเป็นถูกต้อง หากสิ่งใดมันสามารถทำหน้าที่เป็นแบบฝึกหัด / ตัวอย่าง / ช่วยเหลือขนาดเล็กสำหรับบุคคลต่อไป
ติดตั้ง
- FBO, VAO, VBO
- หน้าต่าง 512x448
- ตาราง 64x64
gl_Position = projection * world * position;
projection
ถูกกำหนดโดยortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
นี่คือฟังก์ชั่นการฉายภาพแบบตั้งฉากกับตำราworld
ถูกกำหนดโดยตำแหน่งกล้องคงที่ที่ (0, 0)position
ถูกกำหนดโดยตำแหน่งของสไปรต์
ปัญหา
ในภาพหน้าจอด้านล่าง (มาตราส่วน 1: 1) ระยะห่างของกริดคือ 64x64 และฉันกำลังวาดหน่วยที่ (64, 64) อย่างไรก็ตามหน่วยวาดประมาณ ~ 10px ในตำแหน่งที่ไม่ถูกต้อง ฉันได้ลองใช้ขนาดหน้าต่างที่เท่ากันเพื่อป้องกันการบิดเบี้ยวของขนาดพิกเซล แต่ตอนนี้ฉันหลงทางเล็กน้อยในวิธีการที่เหมาะสมในการให้การฉายภาพแบบพิกเซลต่อโลก 1: 1 ยังไงก็ตามนี่คือรูปภาพบางส่วนที่จะช่วยคุณได้
ฉันตัดสินใจใส่สไปรต์จำนวนมากในสิ่งที่เครื่องยนต์เชื่อว่าเป็นออฟเซ็ต 64x
เมื่อสิ่งนี้ดูเหมือนจะเกิดขึ้นฉันไปเกี่ยวกับและทำกรณีฐานของ 1 หน่วย ซึ่งดูเหมือนจะเข้าแถวตามที่คาดไว้ สีเหลืองแสดงความแตกต่าง 1px ในการเคลื่อนไหว
สิ่งที่ฉันต้องการ
การเคลื่อนที่ในทิศทางใดก็ได้หน่วยที่ 64 จะแสดงผลลัพธ์ต่อไปนี้
จุด
ดูเหมือนว่าจุดยอดที่ไปสู่จุดยอดถูกต้อง ตัวอย่างเช่นในการอ้างอิงถึงภาพแรกข้อมูลจะมีลักษณะเช่นนี้ใน VBO:
x y x y
----------------------------
tl | 0.0 24.0 64.0 24.0
bl | 0.0 0.0 -> 64.0 0.0
tr | 16.0 0.0 80.0 0.0
br | 16.0 24.0 80.0 24.0
เพื่อความสมบูรณ์นี่คืออาร์เรย์จริงที่สอดคล้องกับการเคลื่อนไหวด้านบน:
x y z w r g b a s t
-------------------------------------------------------------
tl | 0.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.62650603
bl | 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.76506025
tr | 16.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.76506025
br | 16.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.62650603
-------------------------------------------------------------
-------------------------------------------------------------
tl | 64.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.21084337
bl | 64.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.3554217
tr | 80.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.3554217
br | 80.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.21084337
// side bar: I know that I have unnecessary data with having a z-axis.
// The engine flips between perspective and orthogonal and I
// haven't selectively started pruning data.
ฉายเมทริกซ์
เมทริกซ์การฉายสำหรับหน้าต่าง 512x448 มีลักษณะดังนี้:
0.00390625 0.0 0.0 0.0
0.0 0.004464286 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
และถูกสร้างขึ้นด้วยฟังก์ชั่นการฉายภาพมุมฉากตำรา:
ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
// explicitly: ortho(-512/2.0f, 512/2.0f, -448/2.0f, 448.0f
ortho(float left, float right, float bottom, float top)
{
projection.setIdentity();
projection.m00 = 2.0f / (right - left);
projection.m11 = 2.0f / (top - bottom);
projection.m22 = -1;
projection.m30 = -(right + left) / (right - left);
projection.m31 = -(top + bottom) / (top - bottom);
projection.m32 = 0;
}
เมทริกซ์มุมมองโลก
ตำแหน่งของกล้องเป็นเพียงเมทริกซ์การแปลซึ่งในกรณีนี้ฉันเพิ่งชดเชยด้วย -w / 2 และ -h / 2 ให้เป็นศูนย์เมื่อเทียบกับศูนย์
1.0 0.0 0.0 -256.0
0.0 1.0 0.0 -224.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
แนวทางแก้ไขที่ฉันได้ลอง
player.moveRight()
จะย้าย 1 หน่วยด้วยอัตราส่วนกว้างยาวที่รวมอยู่ในสมการ ดังนั้น:gridWidth = 64 / 1.14f
. การเคลื่อนไหวไม่พอดีกับตารางบังคับให้หน้าต่างขนาด 512x512 ที่มีการฉายภาพฉากฉากที่ตรงกัน
พยายามใช้เวทมนตร์ตัวเลขต่าง ๆ และพยายามวาดความสัมพันธ์ระหว่างทั้งสอง
จากที่กล่าวมาทั้งหมดที่ฉันเชื่อว่าเหลืออยู่ก็คือฉันทำตัวประมาณการตามจริง ดังนั้นฉันกำลังมองหาข้อมูลเชิงลึกเกี่ยวกับการรักษาการประมาณการ 1: 1 พิกเซลต่อโลก