【问题标题】:Problems in finding univocal coordinates from inside a sphere从球体内寻找单义坐标的问题
【发布时间】:2016-06-26 14:11:53
【问题描述】:

我正在与 Three.js [r78] 合作,我在这方面和 JavaScript 上都相当菜鸟

我终于设法从一个半径等于 500 的球体中心的透视凸轮广播了一条光线,当我用浏览器检查时,交叉点的结果很好,但并不令人满意。我需要精确地将点cartesian or spherical doesn't matter 的坐标与同一点的纬度分开。当我选择一个特定点时,我会得到它的笛卡尔坐标的不同值。有时这些价值观并不遥远,有时却大相径庭。缩放 [鼠标滚轮] 存在问题,但不幸的是也没有更改它,就像在下面的示例中,我添加了一个白色标记以显示明显选择的点。真正点击的是红圈内的那个

这里从不同的视口可以看到相同的点,但缩放相同。我希望这两次尝试给出相同的值[当然,大约]。另一边我检查了相机到相交点的距离总是500-,所以碰撞点似乎是完美计算的

我的两个问题,然后是基本代码[其余来自Valiant360]:

  • 用两个不同的坐标计算的同一个物理点[鼠标点击红圈]是这个 Three.js 版本的一个错误还是我忘记了什么/做错了什么?换句话说,我想为同一个物理点击点获得相同的坐标,独立于视口
  • 如果是我的错,该怎么做才能修复它,并且可能具有相同的值也会改变缩放比例

提前感谢那些愿意提供帮助的人,
安东尼诺


    onMouseDown: function(a) 
    {
    [...]

    // retrieving normalized coordinates
    var mouse_2D_vector = new THREE.Vector2( ( event.clientX / window.innerWidth ) * 2 - 1,
                                    -( event.clientY / window.innerHeight ) * 2 + 1);        

    this._raycaster.setFromCamera(mouse_2D_vector, this._camera);

    var intersections = this._raycaster.intersectObjects( [this._mesh], true );
    intersection = ( intersections.length ) > 0 ? intersections[ 0 ] : null;

    if (intersections.length>0)
    {
        intersections[ 0 ].object.material.color.setHex( Math.random() * 0xffffff );

        console.log("Intersected object.x:", intersections[ 0 ].point.x);
        console.log("Intersected object.y:", intersections[ 0 ].point.y);
        console.log("Intersected object.z:", intersections[ 0 ].point.z);
    }

    console.log('intersections.length: ' + intersections.length);       

    },

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    光线投射的问题是:

    如果场景不是 EXACTLY window.innerWidth x window.innerHeight,那么屏幕上的“鼠标单击”位置可能会因为缩放不正确而计算错误。这不是 Three.js 的错误,只是人们一遍又一遍地重复使用相同的代码进行光线投射而没有意识到需要调整比例的问题。

    您可以硬编码宽度和高度来替换 window.innerwidth/height

    或使用 JQuery $elements

    【讨论】:

    • 亲爱的 Rush2112,当我开始分析问题时,我想到了矩阵更新问题和/或渲染问题。我认为这是第一个 - 所以我的错 - 因为正如我告诉你的那样,我还没有那么喜欢 JS,这可能是缺乏经验。但是问题也出现在第一个视口中,因此我理解了。然后我在你回答之前使用另一个漂亮的例子来修复它,这个例子和我的完全一样,只是你告诉的不同。您的答案正是我应用的修复程序,并且在分析我的问题所花费的时间里,您绝对应该得到正确答案的分数。再次感谢!
    【解决方案2】:

    很难确定您要问的具体问题。您能否用粗体总结您的问题是什么?

    但我认为你的问题基本上是,为什么它读出的不是 500 作为到十字路口的距离。

    这样做的原因是您正在处理生成的几何图形,因此形状实际上并不是圆形的。如果它是完美的圆形,那么从中心到外部的距离当然是 500,但是因为我们的几何图形需要具有特定的面才能显示,所以它会在点之间生成三角形,如下所示:

    在每个三角形的中心,与中心的距离将接近但不等于 500。如果您在其中一个交叉点处寻找距离,那么它将准确读出 500,但是越靠近三角形的中心,距离就越短。你的形状越简单,这种效果就会越明显。

    我想这就是你要问的。但是,如果我遗漏了什么,请更新您的问题,因为您的帖子中并不清楚。

    【讨论】:

    • 你好@OtterFamily,感谢您的回答!我的问题是:当我将一条光线从球体中心投射到鼠标位置时[在上面图片的红色圆圈内单击],显示的代码我在渲染器上得到另一个点,在视觉上[见上面的白色标记]和数学上。是来自three.js的错误还是我做错了什么来获取鼠标点击的点的坐标?再次感谢,非常感谢
    猜你喜欢
    • 2012-07-18
    • 2011-02-02
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多