【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2664|回复: 0

Pick原理

[复制链接]
发表于 2008-3-27 10:50:02 | 显示全部楼层 |阅读模式
在游戏及编辑器中经常用到pick拾取世界坐标系中的几何物体,今天周末有空整理下推导公式。

第一步:获取Picking Ray
给出窗口坐标W(x,y)、width、Height、Camera设置,返回射线原点及方向。
推导过程:窗口坐标->屏幕(视口)坐标->视平面坐标->世界坐标系中的射线原点及方向

1. 窗口坐标系到屏幕坐标系的转换公式:
sx = wx / width
sy = 1 – wy / height

2. 因为视口不一定是整个窗口区域,所以视口坐标:
px = (sx – port.left) / (port.right – port.left)
py = (sy – port.bottom) / (port.top – port.bottom )

3. 视口坐标系到视平面坐标系的转换公式:
fx = frustum.left + px * (frustum.right – frustum.left )
fy = frustum.bottom + py * (frustum.top – frustum.bottom )
frustum可以根据水平垂直fov视野及视平面d获得。
可以知道 frustum.left <=fx <= frustum.right; frustum.bottom <=fy <= frustum.top。

4. 根据视平面坐标及相机在世界坐标系中的dir轴、up轴、right轴,得到picking ray:
Pickray.origin = camera_worldlocation
Pickray.dir = camera_right * fx + camera_up * fy + camera_dir*1

第二步:根据pick ray跟世界坐标系中的物体进行相交测试,可以是包围盒测试或三角形测试。

主要是第一步获取世界空间坐标系中的射线原点及方向,容易出错;第二步容易理解就不详细描述了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 07:04

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表