javascript - 单击可放大 WebGL

标签 javascript opengl-es webgl

我需要在 WebGL 中实现相当于“Google map ”样式的缩放效果。具体来说,我有一个简单的二维场景,它始终垂直于相机。当用户单击场景时,相机应缩放到单击上方但更接近二维场景的位置。

例如,请参阅这个 jsfiddle,它实现了场景但没有缩放:

http://jsfiddle.net/JqBs8/4/

如果您有启用 WebGL 的浏览器,您应该会看到在 Z 轴 -7 处渲染的三 Angular 形和正方形(二维)。我已经放入了一个占位符 handleMouseUp() 事件处理程序来记录任何单击事件,但我对如何将单击事件给出的坐标转换为相机的新位置(或者我猜相当于一个新位置)有点迷失 View 矩阵)。

(jsfiddle 基于learningwebgl.com 的教程 1,并使用 glMatrix http://code.google.com/p/glmatrix/ 库进行矩阵运算。请记住,这是 WebGL,与 OpenGL ES 类似,并且无法访问 glu* 函数.)

最佳答案

我在这个 jsfiddle 中写了一些应该对你有帮助的东西。

http://jsfiddle.net/hedzys6r/

(或 https://codepen.io/brainjam/pen/gBZyGm )

只需单击 WebGL 窗口即可放大鼠标指向的位置。

基本思想是,WebGL 窗口中的一个点是通过使用投影矩阵 pMatrix 和 View 矩阵从 3 空间投影得到的( View 矩阵取决于相机的位置和位置)它所看的方向)。这些矩阵的组合在代码中被命名为pvMatrix

如果您想要从窗口返回到三个空间的相反变换,则必须采用剪辑空间坐标 (x,y,z) 并使用 pvMatrix 的逆将其“取消投影”回 3D.在剪辑空间中,坐标的范围是 [-1,1],z 坐标是深度。

在 OpenGL 世界中,这些转换在 gluProject()gluUnproject() 中实现(您可以通过 Google 获取更多信息和源代码)。

在 jsfiddle 示例中,我们计算剪辑空间中的 (x,y) 坐标,然后针对两个不同的 z 值取消投影 (x,y,z)。由此我们得到 3D 空间中映射到 (x,y) 的两个点,并且我们可以推断出方向向量。然后我们可以向该方向移动相机以获得变焦效果。

在代码中,相机位置位于眼睛向量的负值处。

此示例向您展示如何按照您单击的方向移动相机。如果你想真正移向场景中的特定对象,你必须实现对象选择之类的东西,这是另一回事。我给出的示例不知道场景中的对象。

关于javascript - 单击可放大 WebGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613718/

相关文章:

android - 是否有使用 Oxygene 制作的可交叉编译的 OpenGL 示例?

javascript - WebGL 通过索引绘制

java - Processing sketch 在 Java 模式下工作正常,但在 Processing.js 下不行

javascript - 如何在 Angular 中获取事件路由快照 onpopstate 事件

javascript - 从字符串中提取 5 个字符后的文本且没有最后一个斜杠

iphone - 降低质量的 OpenGL ES 屏幕截图 (iPhone)

c# - OpenGL ES 2.0/MonoTouch : Texture is colorized red

javascript - 尝试将 WebGL 纹理清除为纯色

javascript - firestore get 方法完成后执行代码

javascript - onclick按钮更改textarea中的默认文本