如何解决如果摄像机移动,Three.js中的点坐标会改变吗?
我正在使用raycaster函数获取纹理部分的坐标,以作为创建将链接到我网站其他部分的区域的准备。我使用的模型是空心的,并且从内部的某个点射线投射到与模型皮肤的相交处。我已经使用了此处和其他地方建议的标准技术来从鼠标位置确定3d空间中的坐标:
//1. sets the mouse position with a coordinate system where the center
// of the screen is the origin
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
console.log("mouse position: (" + mouse.x + ","+ mouse.y + ")");
//2. set the picking ray from the camera position and mouse coordinates
raycaster.setFromCamera( mouse,camera );
//3. compute intersections
var intersects = raycaster.intersectObjects( scene.children,true );
var intersect = null;
var point = null;
//console.log(intersects);
for ( var i = 0; i < intersects.length; i++ ) {
console.log(intersects[i]);
if (i = intersects.length - 1) {
intersect = intersects[ i ];
point = intersect[ "point" ];
}
这可行,但是如果相机位置发生变化,则结果不一致。我现在的假设是,这是因为鼠标坐标是从屏幕的中心生成的,并且自从我移动相机位置以来,该中心已经改变。我知道getWorldPosition应该保持一致而不管摄像机的移动如何,但是尝试调用point.getWorldPosition
会返回“ undefined”。我是不是在思考为什么我的结果不一致的正确性,如果是这样,我是对的,getWorldPosition
是我所寻找的,我该如何去调用它,以便我可以为相交获得正确的xyz坐标?
已编辑添加: 当我瞄准屏幕上应该是相同点(或接近点)的位置时,我会得到截然不同的结果。
例如,这是我的模型(请原谅下面的垃圾代码-我仍在研究中):
http://www.minorworksoflydgate.net/Model/three/examples/clopton_chapel_dev.html
在相对的墙上击中第一个书写面板的左上角(因此,在图片中标有x的点)会得到这些结果(您可以通过按C键在模型中捕获它们,逃出指针锁,然后在控制台中查看),并将相机置于0,0:
x:-0.1947601252025508, y:0.15833788110908806, z:-0.1643094916216681
如果我在空间中移动(所以摄像机位置为x:-6.140427450769398,y:1.9021520960972597e-14,z:-0.30737391540643844),我在同一位置得到了以下结果(如第二张图片所示) :
x:-6.229400824609087, y:0.20157559303778091, z:-0.5109691487471469
我的理解是,如果这些是相交点的世界坐标,则它们应保持相对相似,但是x坐标相差很大。这是有道理的,因为那是相机移动的轴,但对相交点不应该不起作用吗?
解决方法
我的评论与相机无关,但是我也有关于光线投射器的问题,并且使用以下方法可以更准确地计算鼠标的位置。
emoji = discord.utils.get(ctx.guild.emojis,name="CUSTOM EMOJI NAME")
,
因此,当由于指针锁定而导致没有鼠标可用时,此方法的窍门是使用对象控件创建的射线的方向。它实际上很简单,但实际上并不简单。
var ray_direction = new THREE.Vector3();
var ray = new THREE.Raycaster(); // create once and reuse
controls.getDirection( ray_direction );
ray.set( controls.getObject().position,ray_direction );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。