根据屏幕点击的2d坐标,以及3d摄像机,生成一条带方向的3d射线检测,被射线碰撞的物体,就可以获取到射线碰撞到3d物体上的具体坐标点,然后根据这个坐标点设置被拖动3d节点的位置。
核心代码:
javascript
//触摸移动
onTouchMove(event: EventTouch) {
//射线检测是否碰到其他方块,并修改显示颜色。
let touchPos = event.getLocation();
console.log('触摸移动:', touchPos,event.touch);
if (!this.dragNode) { //有拖拽节点才进行移动。
return;
}
//拖拽
let point = new Vec3(1, 1, 0);
// this.dragNode.setPosition(point);
let ray = this.mainCamera.screenPointToRay(touchPos.x, touchPos.y);
// console.log('ray',ray,PhysicsSystem.instance.raycastClosest(ray))
if (PhysicsSystem.instance.raycastClosest(ray)) {
const res = PhysicsSystem.instance.raycastClosestResult;
console.log('移动位置:',res.hitPoint)
const hitNode = res.collider.node;
// this.dragNode.setPosition(res.hitPoint.x,res.hitPoint.y,res.hitPoint.z);
this.dragNode.setPosition(res.hitPoint.x,1,res.hitPoint.z);
if (hitNode.name.startsWith('tiled')) {
this.cancelTiled();
hitNode.getComponent(MeshRenderer).material = this.tiledImgActive;
this.tiledNodeActive = hitNode;
} else {
this.cancelTiled();
}
} else {
this.cancelTiled();
}
}
核心属性:res.hitPoint