ฉันจะหาฉากตั้งฉากกับเวกเตอร์ 2D ได้อย่างไร


20

ฉันกำลังสร้างเกมจากบนลงล่างซึ่งผู้เล่นเลื่อนไปข้างหน้าไปยังตำแหน่งของเคอร์เซอร์ของเมาส์ ในฐานะที่เป็นส่วนหนึ่งของรหัสการเคลื่อนไหวของผู้เล่นฉันจำเป็นต้องกำหนดเวกเตอร์ที่ตั้งฉากกับเวกเตอร์ที่หันหน้าไปทางผู้เล่นในปัจจุบัน

ฉันจะคำนวณเวกเตอร์ตั้งฉากของเวกเตอร์ 2D ที่กำหนดได้อย่างไร

คำตอบ:


41

ในการรับเวกเตอร์ 2D ตั้งฉากกับเวกเตอร์ 2 มิติอื่นเพียงแค่สลับXและYส่วนประกอบโดยลบYส่วนประกอบใหม่ ดังนั้นจะกลายเป็น{ x, y }{ y, -x }


10
โปรดทราบว่ามีความเป็นไปได้สองอย่างและอันนี้คุณจะได้เวกเตอร์ตั้งฉากซ้ายมือ (-y | x) เป็นเวกเตอร์ด้านขวา
TravisG

1
คุณควรลบล้างแกน y เพื่อให้มีการหมุน CCW ตามแบบแผนดั้งเดิม
RandyGaul

@ TravisG ฉันคิดว่าคุณมีทางซ้ายและขวามั่วสุมกันใช่ไหม (-y, x) เป็นเวกเตอร์ตั้งฉากซ้ายมือและ (y, -x) คือ RHS จากการคำนวณของฉัน
PeteUK

12

ฉันมักจะลืมวิธีการทำเช่นนี้เมื่อฉันต้องการมันดังนั้นฉันจึงเขียนวิธีการขยายสองสามวิธี

    public static Vector2 PerpendicularClockwise(this Vector2 vector2)
    {
        return new Vector2(vector2.Y, -vector2.X);
    }

    public static Vector2 PerpendicularCounterClockwise(this Vector2 vector2)
    {
        return new Vector2(-vector2.Y, vector2.X);
    }

และเป็นหน่วยทดสอบ

    [Test]
    public void Vector2_Perpendicular_Test()
    {
        var a = new Vector2(5, -10);
        var b = a.PerpendicularClockwise();
        var c = a.PerpendicularCounterClockwise();

        Assert.AreEqual(new Vector2(-10, -5), b);
        Assert.AreEqual(new Vector2(10, 5), c);
    }

เส้นตั้งฉาก


ถ้าคุณมีเวกเตอร์ (5, -10) งั้นมันจะเป็น 4 ส่วนใช่ไหม? ถ้าคุณหมุนมันตามเข็มนาฬิกามันจะไม่อยู่ในควอดแดน 3 นั่นคือทั้งสองอย่างเป็นลบ คุณมีฟังก์ชั่นของคุณสับสนหรือไม่?
PeteUK

พวกเขาเป็นวิธีอื่น ๆ PerpendicularCounterClockwise ควรกลับ (10,5) และ PerpendicularCounterClockwise ควรกลับ (-10, -5)
opetroch

2
โอ้ .. นี่มันผิดมา 3 ปีแล้ว ฉันขอโทษทุกคนที่ใช้มัน ตอนนี้ฉันได้แก้ไขคำตอบและดึงไดอะแกรมเพื่อพิสูจน์ว่ามันสมเหตุสมผลในครั้งนี้ ขอบคุณ @opetroch และ PeteUK ที่ชี้เรื่องนี้ออกมา ขออภัยการแก้ไขใช้เวลานานเกินไป
craftworkgames

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