วิธีการแปลงพิกัดของเมาส์เป็นดัชนีมีมิติเท่ากัน?


21

ฉันวาดแผนที่ภาพวาดสามมิติด้วยไทล์64x32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

ภาพแสดงรหัสนี้:

ภาพแสดงรหัสนี้:

มืออาชีพที่รักโปรดช่วยด้วยสูตรการแปลงค่าพิกัดของเมาส์ในดัชนีมีมิติเท่ากันของเซลล์ ตัวอย่าง: (105; 100) -> [1; 4]


เป็นไปได้ที่ซ้ำกันของการเรนเดอร์ Isometric และการเลือก?
bummzack

บันทึก Side: ถ้าคุณไม่จริงต้องการในการเข้าถึงค่าก่อนหน้านี้ของตัวแปรที่คุณกำลังที่เพิ่มขึ้นในขณะที่while(val = arr[i++])หรือสิ่งปลูกสร้างที่คล้ายกันไม่ได้ใช้มัน ใช้++aและ++bแทน
Martin Sojka

คำตอบ:


25

คุณจำเป็นต้องกำหนดเมทริกซ์การแปลงจากพิกัดช่องว่างของกระเบื้องเป็นพิกัดพื้นที่หน้าจอจากนั้นคำนวณเมทริกซ์ผกผันสำหรับสิ่งนี้

โดยวิธีการ: ออฟเซ็ตของคุณชี้ไปยังสถานที่ซึ่งจะเป็น (0.0, 1.0) ในระบบพิกัดใด ๆ ก็ตาม แต่นั่นไม่ใช่ปัญหาใหญ่ แต่เป็นสิ่งที่ต้องคำนึงถึง ซึ่งหมายความว่าออฟเซ็ตของจุดกำเนิดของระบบพิกัดที่แปลงของคุณอยู่ที่ (Offset + 32, 0)


กรณีเฉพาะ

สิ่งที่คุณทำโดยทั่วไปสำหรับการแปลง tile-space (a, b) พิกัดเป็น screen-space (x, y) พิกัดคือการเรียกใช้มันผ่านเมทริกซ์การแปลงต่อไปนี้:

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

คำจำกัดความ: aและbสำหรับกระเบื้อง (0, 0) อยู่ในช่วง [0.0, 1.0) โดยที่ (0.0, 0.0) เป็นมุมบน, (1.0, 1.0) มุมล่าง, (0.0, 1.0) ที่มุมซ้าย และ (1.0, 0.0) มุมขวาในพื้นที่หน้าจอ

เราขยายคำจำกัดความพิกัดโดยพิกัดที่สามที่คงที่ (เสมอ 1 เสมอ) เพื่อให้สามารถรวมการแปลลงในเมทริกซ์

ตอนนี้คุณสามารถสร้างเมทริกซ์ผกผันสำหรับการแปลงนี้ สูตรพื้นฐานคือ:

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

... กับCเป็นเมทริกซ์ของปัจจัยสำหรับ

ในกรณีของคุณดีเทอร์มิแนนต์ A | อยู่ที่ 1024 เสมอไม่ว่าจะชดเชยอะไรดังนั้นเมทริกซ์ผกผันคือ:

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


ตัวอย่างการคำนวณ

ตอนนี้สำหรับข้อมูลตัวอย่างของคุณ ...

ใส่หมายเลขของคุณเพื่อชดเชยในสูตรและคุณจะได้รับ:

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

การคูณ (105, 100, 1) (พิกัดหน้าจอ) ด้วยเมทริกซ์ทำให้คุณได้รับ:

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

เนื่องจากพิกัดที่สามมีค่าเป็น 1 เสมอเราจึงไม่ต้องคำนวณ ปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุดและคุณจะได้รับ (1, 4) เป็นพิกัดพื้นที่ไทล์ของคุณตามที่คาดไว้


เมทริกซ์การฉายภาพเมตริกทั่วไป

หากคุณมีมุมมองเช่นนี้กับแต่ละไทล์จะมีความกว้าง2 w (64 ในตัวอย่างดังนั้นw = 32) และ 2 hในความสูง (32 ในตัวอย่างดังนั้นh = 16) และออฟเซ็ตของจุดกำเนิด ในพื้นที่หน้าจอเป็น f xและ f yสำหรับแกนนอนและแนวตั้งตามลำดับ (ในตัวอย่าง 192 และ 0) เมทริกซ์จะมีลักษณะดังนี้

พื้นที่ไทล์ไปยังพื้นที่หน้าจอ

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

พื้นที่หน้าจอเพื่อพื้นที่กระเบื้อง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.