ฉันจะแปลงจากพื้นที่พิกัดทั่วโลกเป็นพื้นที่ท้องถิ่นได้อย่างไร


13

กำหนดเอนทิตีที่ชื่อEntityAฉันต้องการกำหนดพื้นที่พิกัดเฉพาะที่ซึ่งตำแหน่งของEntityAเป็นจุดเริ่มต้นเวกเตอร์ส่วนหัวของมันคือแกน X และปกติของเวกเตอร์หัวเรื่องคือแกน Y:

คำอธิบายภาพเหมือนกัน

จากพิกัดโลกของพวกเขาฉันจะค้นหาตำแหน่งของเอนทิตี้อื่นในEntityAพื้นที่ท้องถิ่นได้อย่างไร

ตัวอย่าง: EntityAตำแหน่งส่วนกลางของ (50,50) และตำแหน่งนั้นEntityBคือ (80,90) ตำแหน่งของEntityBในEntityAพื้นที่ท้องถิ่นคืออะไร?

แก้ไข: กรุณาใช้คณิตศาสตร์ง่ายๆ

คำตอบ:


21

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

สมมติว่าเมทริกซ์การหมุน, การปรับสเกลและการแปลของวัตถุ A ที่ใช้เพื่อนำไปสู่ ​​Global Space คือR , SและTตามลำดับ คุณจะคูณเหล่านี้เข้าด้วยกันเช่น

S * R * T = W

ทีนี้ลองใช้Wแล้วหาอินเวอร์สW ^ -1อย่างใด ค่าผกผันของเมทริกซ์คือเมทริกซ์ซึ่งทำหน้าที่ตรงกันข้าม ผลคูณของเมทริกซ์ที่มีค่าผกผันเป็นเมทริกซ์เอกลักษณ์เสมอ

W * W ^ -1 = I

ดังนั้นW ^ -1 = I / W ;

ทีนี้ให้เมทริกซ์ผกผันนี้เปลี่ยนโลกให้เป็นฉากและแต่ละวัตถุจะอยู่ในพิกัดที่คุณต้องการ

สำหรับการคูณเมทริกซ์ดูที่หน้านี้ สำหรับเมทริกซ์เอกลักษณ์ให้ดูสิ่งนี้

นี่เป็นอีกหน้าหนึ่งที่ช่วยให้คุณฝึกอบรมที่คุณจะต้องทำให้W

ในคำถามข้างต้นคุณควรใช้การแปลในแกน x เป็น 50, การแปลในแกน y เป็น 50, ไม่มีการปรับสเกลในแกนใดแกนหนึ่งและการหมุนที่คุณไม่ได้ระบุ


ขอบคุณสำหรับคำตอบจริง ๆ แล้วฉันไม่เข้าใจเรื่องนี้มากนัก ไม่ค่อยเก่งเรื่องคณิตศาสตร์ เมทริกซ์คืออะไร? คุณหมายถึง 'การหมุนเวียนการปรับและการแปลเมทริกซ์'
Aviv Cohn

เมทริกซ์เป็นวิธีที่ขนาดเล็กมากของการเป็นตัวแทนชุดของตัวเลขสัมพันธ์หรือวัตถุ ในคอมพิวเตอร์กราฟิกส์พวกเขาใช้อย่างกว้างขวางเพื่อทำการคำนวณ ตรวจสอบลิงค์สุดท้ายในคำตอบเพื่อทราบว่าฉันหมายถึงอะไรโดยการแปลแบบ Rotation และ Scaling matrices.yes คุณจะต้องอ่านทั้งหมด มิฉะนั้นคุณสามารถใช้วิธีของ Ashes999 เพื่อแก้ปัญหาของคุณ แต่นั่นไม่ได้หมายความว่าจะต้องมีการหมุนเวียนและปรับขนาดของ EntityA หากมี
The Light Spark

9

ฉันทำสิ่งนี้ด้วยตรีโกณมิติแทนที่จะเป็นเมทริกซ์ในอดีต (ฉันเป็นเมทริกซ์ noob) คำตอบของ Ashes999 อยู่ที่นั่นครึ่งหนึ่งแล้วรับเวกเตอร์สัมพัทธ์จากนั้นหมุนมันโดยมุมของเอนทิตี้ A

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX

2
+1 ตรีโกณมิติใช้งานง่ายกว่าและง่ายกว่าเมทริกซ์
Ramchandra Apte

แล้วเกล็ดล่ะ คุณจะใช้มันเมื่อใด
Llamageddon

ขออภัยหมายถึงการหมุน
Llamageddon

6

ให้ฉันลองให้คุณบางสิ่งบางอย่างระหว่างคำตอบของ The Light Spark และคำตอบของ Elliot เพราะจากสิ่งที่ฉันอ่านคุณกำลังมองหาอัลกอริทึมที่จะติดตามและไม่ใช่แค่คณิตศาสตร์ที่โยนให้คุณ

คำแถลงปัญหา: เนื่องจากคุณมีสถานที่ตั้งA (50, 50)และส่วนหัว (เนื่องจากคุณไม่ได้ระบุไว้ฉันจะยืนยันเป็นy = 2 * x + 25) ค้นหาที่ซึ่งB (80, 90)สัมพันธ์กับAและส่วนหัว

สิ่งที่คุณต้องการทำนั้นค่อนข้างตรงไปตรงมา 1) ย้ายAที่มาของระบบของคุณ นี้เป็นเพียงหมายความว่าท้องถิ่น-to- ค่าที่จะไปเป็นค่าตำแหน่งทั่วโลกลบค่าของตำแหน่งทั่วโลกของA กลายเป็นและจะกลายเป็นAA(0, 0)B(30, 40)

1.1) หัวเรื่องจะต้องถูกย้ายเช่นกัน นี่เป็นเรื่องง่ายมากที่จะทำเพราะการตัดแกน y ในAเงื่อนไขเป็น 0 เสมอและความชันจะไม่เปลี่ยนดังนั้นเราจึงy = 2 * xเป็นหัวเรื่อง

2) ตอนนี้เราจำเป็นต้องจัดตำแหน่งส่วนหัวก่อนหน้าให้กับแกน X ดังนั้นเราจะทำเช่นนี้ได้อย่างไร วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการแปลงจาก x, y พิกัดไปเป็นระบบพิกัดเชิงขั้ว ระบบพิกัดของโพลาร์นั้นเกี่ยวข้องกับRระยะทางไปยังที่ตั้งและphiมุมของการหมุนจากแกน x Rถูกกำหนดให้เป็นsqrt(x^2 + y^2)และถูกกำหนดให้เป็นphi atan(y / x)ภาษาคอมพิวเตอร์ส่วนใหญ่วันนี้ไปข้างหน้าและกำหนดatan2(y, x)ฟังก์ชั่นที่ทำสิ่งเดียวกันแน่นอนatan(y/x)แต่ทำในลักษณะที่เอาท์พุทมีแนวโน้มที่จะจาก -180 องศาถึง 180 องศามากกว่า 0 องศาถึง 360 องศา แต่ทั้งสองทำงาน

Bจึงกลายเป็นR = sqrt(30^2 + 40^2) = sqrt(2500) = 50และphi = atan2(40, 30) = 53.13ในองศา

ในทำนองเดียวกันหัวเรื่องจะเปลี่ยนไป นี่เป็นคำอธิบายที่ยุ่งยากเล็กน้อย แต่เนื่องจากหัวเรื่องตามคำนิยามส่งผ่านจุดกำเนิดของเราเสมอAเราไม่จำเป็นต้องกังวลเกี่ยวกับRองค์ประกอบ หัวมักจะอยู่ในรูปแบบของphi = Cที่Cเป็นค่าคงที่ ในกรณีนี้phi = atan(2 * x / x) = atan(2) = 63.435องศา

ตอนนี้เราสามารถหมุนระบบเพื่อย้ายส่วนหัวไปยังแกน X ของAระบบโลคอล เหมือนตอนที่เราย้ายAไปที่ต้นกำเนิดของระบบสิ่งที่เราต้องทำคือลบphiส่วนหัวของphiค่าทั้งหมดในระบบ ดังนั้นphiของBกลายเป็น53.13 - 63.435 = -10.305ดีกรี

ในที่สุดเราต้องแปลงกลับจากพิกัดเชิงขั้วเป็น x, y พิกัด โดยมีสูตรการทำการเปลี่ยนแปลงที่มีและX = R * cos(phi) Y = R * sin(phi)สำหรับBดังนั้นเราจึงได้รับX = 50 * cos(-10.305) = 49.2และY = 50 * sin(-10.305) = 8.9ดังนั้นBในท้องถิ่น-to- พิกัดอยู่ใกล้กับA(49,9)

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


1

คุณจำเป็นต้องรู้รูปแบบของเอนทิตี A ในพื้นที่ส่วนกลาง (x1, y1, θ) โดยที่θคือการวางแนวที่สัมพันธ์กับแกน x

ในการแปลงตำแหน่ง EntityB จากพิกัดส่วนกลาง (x2, y2) เป็นพิกัดในพื้นที่ (x2 ', y2'):


  1. การใช้การแสดงออก

ทั่วโลกสู่ท้องถิ่น

x2' = (x2-x1)cosθ + (y2-y1)sinθ

y2' = -(x2-x1)sinθ + (y2-y1)cosθ

ท้องถิ่นสู่สากล

x2 = x2'cosθ - y2'sinθ + x1

y2 = x2'sinθ + y2'cosθ + y1

  1. ใช้เมทริกซ์:

    R = [cosθ   -sinθ
    
         sinθ    cosθ]
    
    A = [x1
         y1]
    
    B_global = [x2
                y2]
    
    B_local = [x2' 
               y2']

ทั่วโลกสู่ท้องถิ่น

    B_local = inv(R) x (B_global - A)

ท้องถิ่นสู่สากล

    B_global = R x B_local + A

-2

หากต้องการกล่าวง่ายๆก็คือเอนทิตี B จะต้องมีการอ้างอิงไปยังเอนทิตี A จากนั้นคุณจะต้องได้รับความแตกต่างระหว่างสถานะ A ของเอนทิตีและตำแหน่งของเอนทิตี B


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