【问题标题】:vec3.unproject() mouse collision problemsvec3.unproject() 鼠标碰撞问题
【发布时间】:2012-01-20 02:59:27
【问题描述】:
var fNearZ  = -100.0;
var farZ    = 100.0;
var fZoom   = 10.0;
var iR      = this.iWidth/fZoom;
var iL      = (this.iWidth/fZoom)*(-1);
var iT      = this.iHeight/fZoom;
var iB      = (this.iHeight/fZoom)*(-1);

var pMatrix     = new mat4.ortho(iL, iR, iB, iT, fNearZ, farZ);
var mvMatrix    = new mat4.create();

mat4.identity(mvMatrix);
zI.debug(mat4.str(mvMatrix),{'grp':'mv_before','style':'color:#060;'});

mat4.translate(mvMatrix, [0.0, 0.0, -50.0]);
mat4.scale(mvMatrix, [3, 3, 3]);

zI.debug(vec3.unproject([
        parseFloat(this.pLastMouse.x-this.iLeft),
        parseFloat(this.pLastMouse.y-this.iTop),
        0
    ],
    mvMatrix,
    pMatrix,
    [
        0,
        0,
        this.iWidth,
        this.iHeight
    ]),{'grp':'dest____','style':'color:#00F;'});

this.setMatrices(pMatrix, mvMatrix);
//After this line, buffers will be set

屏幕网址:http://i.stack.imgur.com/au2ac.png

今天我尝试用新版本的gl-matrix实现我的鼠标碰撞,提供vec3.unproject。我想要的是获得鼠标位置的 z 世界坐标。正如您在屏幕截图中看到的那样,x 和 y 坐标都可以,但无论光标在哪里,z 坐标始终为 50。

每个平面都是 1.0x1.0,之间有 0.1 间距。

当我在 Y 轴上添加旋转或平移时,我从 unproject 接收到错误的 (?) x 和 y 坐标。我认为我处理 mvMatrix 和 pMatrix 的方式是错误的。谁能帮帮我?

编辑 不使用 .translate() 和 .scale() 函数我现在得到正确的 zNear 和 zFar 值,当我将这些函数应用于模型视图矩阵时,仍然不知道坐标是否正确。仍然缺少的是交集计算。

链接到我的来源: http://jsfiddle.net/matthoz/vucAq/

【问题讨论】:

  • 我应该提一下,glMatrix 中的 unproject 功能非常新,还没有经过多场景的大量严格测试。我完全有可能搞砸了。是否可以将您的来源发布在某个地方以便我可以交叉检查?

标签: javascript math webgl collision


【解决方案1】:

问题在于“鼠标位置的 z 世界坐标”不是坐标,而是它们的无限数量(从鼠标的 x、y 位置射出的假想线)。我猜 50 是一个任意值,或者你在 mvMatrix 上得到的 50.0。

如果您使用 zFar 和 zNear 进行两次取消项目调用,您将获得一个可以开始处理的有限矩形。

【讨论】:

  • 感谢您的回复。我为 unproject 添加了第二个调试调用,并在第一次调用中将 zNear 分配给 vec[2],在第二次调用中将 zFar 分配给 vec[2]。 z 的结果是 6716.666... (zNear) 和 -6616.666... 对于 zFar :S
  • 嗯,如果你用平面的Z值调用会发生什么?
  • myweb.lmu.edu/dondi/share/cg/unproject-explained.pdf 这里有很多关于 unProject 工作原理的理论,首先尝试 zNear=0 和 zFar=1 并让我们知道结果
  • [parseFloat(this.pLastMouse.x-this.iLeft),parseFloat(this.pLastMouse.y-this.iTop),parseFloat(0)] 用于第一次调用 (zNear) 和 [parseFloat(this.pLastMouse.x-this.iLeft),parseFloat(this.pLastMouse.y-this.iTop),parseFloat(1)] 用于第二次调用 (zFar):结果 50.000... 用于 zNear(0) 和 -16.666 用于 zFar(1) - 我在正确的位置插入 zNear=0 和 zFar=1,还是应该在 mat4.ortho 顶部替换 var fNearZ=-100.0; var farZ=100.0;? BTW - TY 用于链接 unproject-pdf!
  • 我已阅读文档,您已发布。如果我得到的值(50 和 -16)正确地代表了射线的 zNear 和 zFar(我不相信),那么仍然缺少计算交点的代码,对吧?
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多