Skip to content

Commit

Permalink
完成鼠标选择事件的说明
Browse files Browse the repository at this point in the history
  • Loading branch information
asxzq committed Jul 21, 2021
1 parent d1be678 commit f2950d0
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 16 deletions.
Binary file added extradocs/tech-mousepick-00.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
57 changes: 41 additions & 16 deletions extradocs/tech-mousepick.dox
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,56 @@



## www
## 鼠标拾取物体概览

sss
本程序主要应用射线法进行点和物体的拾取。

~~~{.cpp}
int main(int args) {
return 0;
}
~~~
鼠标点击屏幕后,获取世界坐标系下摄像机位置,计算摄像机在点击方向上发出的射线的单位向量。

将射线和摄像机位置投影到每一个物体的模型坐标系下,获取模型坐标系下射线捕获的点。将所有捕获的点,变换到世界坐标系下,比较点到摄像机的距离,取最小距离对应的点为拾取点。

最后根据拾取点,索引到所在物体。

此步骤是程序较为重要的一步,是交互界面中的基础步骤,为后续的改变物体属性、姿态、位置、大小和物体的标记等操作提供条件。

## 鼠标拾取物体原理

### 计算射线单位向量

首先获取屏幕坐标的归一化坐标`ndc`,而后将`ndc`转化到相机坐标系,则相机坐标系下,射线的方向向量即为所求向量的归一化,公式如下:

\f[
A_{C \rightarrow P}=\begin{bmatrix}
f * S_x / d_{px} & 0.0 & C_x & 0.0 \\
0.0 & f / d_{py} & C_y & 0.0 \\
0.0 & 0.0 & f & 0.0 \\
0.0 & 0.0 & 1.0 & 0.0 \\
\end{bmatrix}
\text{ray_camera} = normalize(\text{MAT_PERSPECTIVE}^{-1}*\text{ndc}-(0,0,0,0)^{T})

\f]

### 在每个模型中拾取点

将射线和相机坐标转化到模型系下:

\f[
\text{ray_model} = \text{MAT_MODEL}^{-1}* \text{MAT_VIEW}^{-1} * \text{ray_camera} \\\

\text{campos_model} = \text{MAT_MODEL}^{-1} *\text{campos_world}

\f]

#### 射线步进法

根据摄像机位置和射线拾取点时,用到射线步进法,主要步骤见下图:

\image html tech-mousepick-00.png width=50%

设初始搜索点为`A`,搜索到模型距离其最近的点为`O_1` ,判断`O_1`点到射线的距离是否小于阈值,不满足则将搜索点沿着射线方向移动`O_1A-r_1`的距离到搜索点`B`。

asdfas
重复上述过程,搜索点`B`搜索到模型距离其最近的点为`O_2` ,判断`O_2`点到射线的距离是否小于阈值,不满足则将搜索点沿着射线方向移动`O_2B-r_2`的距离到搜索点`C`。

- sdf
在`C`处搜索到`O_3`点,计算`O_3`点到射线的距离,发现小于阈值,则确定捕获这一点,将模型指针和这个点的索引值记录

**值得注意的是:**如果一直没有搜索到需要的点,则当搜索点射出模型范围,即跳出搜索。

### 选出最优点

将记录的每个点都转换到世界坐标系下,计算世界坐标系中各个选中点到摄像机的距离,取距离最小的点为最终选择点,该点所在的模型为最终选择的模型

*/
*/

0 comments on commit f2950d0

Please sign in to comment.