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)
}
添加回答
举报