xr-frame 用cube代替线段实现两点间的连线

前置数据

     // 方向向量
      const forward = xr.Vector3.createFromNumber(0,0,0);
     // 上方向
      const up =  xr.Vector3.createFromNumber(0, 1, 0);
     // 方向四元数
      const useQuaternion = xr.Quaternion.createFromNumber(0, 0, 0, 0);
     // standard材质
      const effectStandard = scene.assets.getAsset('effect', 'standard');
     // cube资源
      const geometryLine = scene.assets.getAsset('geometry', 'cube');

获取两点的世界坐标

const preCubeTrs = this.scene.getElementById('pre').getComponent('transform')    
const cubeTrs= this.scene.getElementById('cur').getComponent('transform')                  
const preWorldPosition = preCubeTrs.worldPosition;
const worldPosition = cubeTrs.worldPosition;

算两点间中点的位置

            // 算中点
            const posX = (preWorldPosition.x + worldPosition.x) / 2
            const posY = (preWorldPosition.y + worldPosition.y) / 2
            const posZ = (preWorldPosition.z + worldPosition.z) / 2

计算方向向量

            // forwad 向量
            preWorldPosition.sub(worldPosition, forward);

方向应用到四元数(由forward方向生成四元数)

            // 方向四元数
            xr.Quaternion.lookRotation(forward, up, useQuaternion);
            console.log(useQuaternion.x, useQuaternion.y, useQuaternion.z, useQuaternion.w)

计算向量的模,即两点间的距离

            // 向量的模
            const module = preWorldPosition.distanceTo(worldPosition);

绘制线,在中点位置放置一个cube,其xy长度自定义,z取模长,再应用到方向四元数,就可以成功的把cube连接到两个点

            const lineSize = 0.02;
            // line
            const lineEle = scene.createElement(xr.XRNode, {
              position: `${posX} ${posY} ${posZ}`,
              scale: `${lineSize} ${lineSize} ${module}`
            });
            // 加到场上
            root.addChild(lineEle);
            const lineTrs = lineEle.getComponent(xr.Transform);
            lineTrs.quaternion.x = useQuaternion.x;
            lineTrs.quaternion.y = useQuaternion.y;
            lineTrs.quaternion.z = useQuaternion.z;
            lineTrs.quaternion.w = useQuaternion.w;

            const matLine = scene.createMaterial(effectStandard);
            const color2 = colorPattern2[Math.floor(Math.random() * colorPattern2.length)];

            matLine.setVector('u_baseColorFactor', xr.Vector4.createFromNumber(color2[0], color2[1], color2[2], 1.0));
            matLine.setRenderState('cullFace', xr.ECullMode.FRONT);
            const meshLine = lineEle.addComponent(xr.Mesh, {
              geometry: geometryLine,
              material: matLine,
            });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山楂树の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值