Làm cách nào để đi từ tọa độ thế giới (X / Y) sang tọa độ ô vuông?


7

Vì vậy, tôi đã có trò chơi này được hiển thị trong chế độ xem isometric giả với mã sau đây để tạo lưới:

_x = x + ( y & 1 > 0 ? 0 : 0.5 );
_y = y * 0.25;

ADD_VERTICES( [
        _x-0.5,  _y,      0,  _uv[0], _uv[3], //B
        _x,      _y+0.25, 0,  _uv[0], _uv[1], //A
        _x+0.5,  _y,      0,  _uv[2], _uv[1], //C

        _x+0.5,  _y,      0,  _uv[2], _uv[1], //C
        _x,      _y-0.25, 0,  _uv[0], _uv[1], //D
        _x-0.5,  _y,      0,  _uv[0], _uv[3], //B
] );

Tạo tứ giác (2 tam giác thực sự) với các góc sau:

0 0 [0.5, -0.5  -   0, 0,       -   0.5, 0.5    - 1, 0]
1 0 [1.5, -0.5  -   1, 0,       -   1.5, 0.5    - 2, 0]
0 1 [0, 0       -   -0.5, 0.5   -   0, 1        - 0.5, 0.5]
1 1 [1, 0       -   0.5, 0.5    -   1, 1        - 1.5, 0.5]

Tôi có thể lấy tọa độ thế giới từ vị trí chuột, từ bao giờ, tôi không thể tìm ra cách lấy từ tọa độ thế giới trở lại tọa độ gạch. Thuật toán cho điều đó là gì? (Hoặc, làm thế nào tôi có thể thay đổi các đỉnh xung quanh để dễ dàng hơn)


1
Chỉ cần đảo ngược ma trận - bằng tay hoặc bằng cách gọi thư viện Toán học và in kết quả.
Pieter Geerkens

Chắc chắn @pieter, ma trận gì? Như được hiển thị ở trên, không có ma trận nào liên quan ...
Elva

Có vẻ như, bạn có gạch có chiều cao và chiều rộng bằng nhau, cả hai đều là 1, phải không?
Iman

@Iman Chúng thực sự cao 1 rưỡi (nhưng kích thước đơn vị chỉ là một sự biến đổi có thể đảo ngược).
Elva

ok, tôi hiểu rồi, Bạn đã chọn hệ tọa độ isometric khó nhất, điều này làm cho tất cả các phép biến đổi trở nên rất khó, liệu có thể thay đổi bản đồ ô vuông thành cái gì đó như i.stack.imgur.com/QQKfB.png
Iman

Câu trả lời:


4

Trước tiên, bạn cần tổ chức lại việc đánh số các ô của mình trong bản đồ Isometric, việc xác định trục đẳng phương cùng với các ô xếp sẽ dễ dàng hơn nhiều.

Như thế này

Hệ thống tọa độ gạch

Hãy xem hướng dẫn sau đây là hướng dẫn tốt nhất mà tôi tìm thấy trên Internet, có rất nhiều hướng dẫn toán học bản đồ đẳng cự trên web nhưng anh chàng này là một nhà tiên tri!

http://clintbellanger.net/articles/isometric_math/

như hướng dẫn nói rằng bạn có thể chuyển đổi tọa độ bản đồ thành tọa độ đẳng cự thông qua các phương trình sau

screen.x = (Isomap.x - Isomap.y) * TILE_WIDTH_HALF;
screen.y = (Isomap.x + ISomap.y) * TILE_HEIGHT_HALF;

vì các ô của bạn có chiều rộng và chiều cao bằng nhau thì dễ hơn một chút nhưng tôi đã sử dụng kích thước ô này: (36,24) có giao diện đẹp hơn, nhưng vị trí camera vẫn đủ cao để có thể xem tất cả các yếu tố trên bản đồ mà không bị chồng chéo

Trò chơi của tôi

Tuy nhiên, công thức trên có thể cần phải thay đổi một chút vì nguồn gốc của hệ tọa độ gạch là điểm trên của ô đầu tiên từ trên xuống, nhưng bạn có thể sử dụng trung tâm của ô trên cùng làm gốc của mình, cá nhân tôi đã sử dụng phía dưới bên trái đỉnh MBB của ô trên cùng là gốc Vì vậy tôi phải dịch (di chuyển) nửa băng thông tọa độ, nửa sáng vì vậy đây là của tôi:

func project(Cartesian screen : CGPoint) -> CGPoint {
    let TILE_WIDTH_HALF = (tileWidth / 2)
    let TILE_HEIGHT_HALF = (tileHeight / 2)
    let movedScreen = CGPointMake(-1, -1) * (screen - CGPointMake(tileWidth,tileHeight))
    let mapx = ((movedScreen.x / TILE_WIDTH_HALF) + (movedScreen.y / TILE_HEIGHT_HALF)) / 2;
    let mapy = ((movedScreen.y / TILE_HEIGHT_HALF) - (movedScreen.x / TILE_WIDTH_HALF)) / 2;
    return CGPointMake(mapx+0.5, mapy+1.5)
}

Nếu bạn nhìn sâu hơn, bạn sẽ thấy rằng tôi đang đảo ngược Y trước và sau công thức biến đổi Bản đồ 2 vì trong iOs y tăng lên bằng cách đi lên trên màn hình nhưng trong hướng dẫn y sẽ hạ xuống bằng cách đi lên.

Vì vậy, nếu bạn đang viết trò chơi của mình cho một thiết bị di động, bạn cũng cần phải làm điều đó

Vào cuối chức năng của tôi, tôi đã thêm 0,5,1,5 vào hệ thống tọa độ gạch của mình.

Như bạn thấy, có một chút khó hiểu và tùy thuộc vào cách bạn đã vẽ các ô của mình và hướng tích cực của bạn lên hoặc xuống, bạn cần thay đổi công thức cơ bản trong hướng dẫn một chút. Xin lỗi vì tôi không thể cung cấp cho bạn phương trình chính xác nhưng tôi có thể chỉ cho bạn cách thực hiện. (tìm phương trình của riêng bạn)

viết công thức cơ bản nhưng thêm Tx và Ty vào cả hai phương trình, bạn cần tìm Tx và Ty là gì trong trường hợp của bạn. Để tìm hiểu những gì họ chỉ cần viết phương trình cho hai ô khác nhau (ví dụ: Ngói 0,1 và ô 1,1) như bạn đã làm trong câu hỏi của mình ở trên. sau đó bạn sẽ có một phương trình hoàn chỉnh

    screen.x = (Isomap.x - Isomap.y) * TILE_WIDTH_HALF + Tx;
    screen.y = (Isomap.x + ISomap.y) * TILE_HEIGHT_HALF+ Ty;

Và đây là mã ngược của tôi, nếu bạn so sánh nó với hướng dẫn, bạn sẽ thấy rằng nó cũng đã thay đổi một chút. và bạn phải tự tìm kiếm bằng kỹ năng bạn vừa đạt được ở trên.

func unproject (tileIndex tileIdx : CGPoint) -> CGPoint
{
    let TILE_WIDTH_HALF = (tileWidth / 2) // 16
    let TILE_HEIGHT_HALF = (tileHeight / 2) // 12

    let screenX = TILE_WIDTH_HALF * (tileIdx.y - tileIdx.x + 1)
    let screenY = 24 - TILE_HEIGHT_HALF * (tileIdx.x + tileIdx.y)
    return CGPointMake(screenX, screenY)

}

Ngọt! Đó là một câu trả lời tuyệt vời. Tôi sẽ thực hiện nó khi tôi về nhà và chấp nhận sau đó :) Cảm ơn.
Elva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.