1 回答

TA貢獻1824條經驗 獲得超5個贊
世界 <=> 視圖
為了建立白話,使用的術語是
World:世界/運動場/(紅框)的坐標系(以像素為單位)。
View:畫布/相機/(藍框)的坐標系(以畫布像素為單位)。
正如評論中指出的那樣。您需要視圖原點。那是世界空間中畫布左上角的坐標。
您還需要知道視圖比例。那是畫布與世界的關系。
需要的信息
const world = {width: 2048, height: 1024}; // Red box in pixels
const view = { // blue box
origin: {x: 500, y: 20}, // in world scale (pixels on world)
scale: {width: 1, height: 1}, // scale of pixels (from view to world)
}
如果沒有此信息,您將無法進行轉換。它必須存在,因為它需要將世界內容呈現到畫布。
請注意,如果比例是,1它們可能只能在畫布渲染系統中推斷出來。如果找不到秤,請使用1.
注意此答案假定視圖沒有旋轉。
查看 => 世界
以下函數將從視圖坐標轉換為世界坐標。
function viewToWorld(x, y) { // x,y pixel coordinates on canvas
return {
x: x * view.scale.width + view.origin.x,
y: y * view.scale.height + view.origin.y
}; // return x,y pixel coordinates in world
}
在客戶端是畫布的鼠標事件中使用
function mouseEvent(event) {
// get world (red box) coords
const worldCoord = viewToWorld(event.clientX, event.clientY);
// normalize
worldCoord.x /= world.width;
worldCoord.y /= world.height;
}
世界 => 視圖
您可以反轉轉換。即使用以下函數從世界坐標移動到視圖坐標。
function normalWorldToView(x, y) { // x,y normalized world coordinates
return {
x: (x * world.width - view.origin.x) / view.scale.width,
y: (y * world.height - view.origin.y) / view.scale.height
}; // return x,y pixel on canvas (view)
}
并以像素為單位
function worldToView(x, y) { // x,y world coordinates in pixels
return {
x: (x - view.origin.x) / view.scale.width,
y: (y - view.origin.y) / view.scale.height
}; // return x,y pixel on canvas (view)
}
添加回答
舉報