cocos creator_计算反射向量

2.x 已知:入射向量,法向量求反射向量 公式:反射向量 - 2 × ( 入射向量 × 法向量 ) × 法向量 // 指定碰撞体在相交点的表面的法线单位向量

2.x

已知:入射向量,法向量求反射向量

公式:反射向量 - 2 × ( 入射向量 × 法向量 ) × 法向量

            // 指定碰撞体在相交点的表面的法线单位向量。const vector_n = result.normal;// 入射单位向量const vector_i = vector_dir;            // 反射单位向量const vector_r = vector_i.sub(vector_n.mul(2 * vector_i.dot(vector_n)));

公式推导过程

3.x

废话不多说,上效果图。

红色代表入射向量和出射向量 ,黑色代表法向量。小球的正前方为(0, 0, -1);

代码:

 update(deltaTime: number) {//入射this.dirNd_0.setWorldPosition(this.node.worldPosition);Quat.fromViewUp(quat_0, this.node.forward); //算出来的朝z轴方向Quat.rotateY(quat_0, quat_0, Math.PI);this.dirNd_0.setRotation(quat_0);Vec3.add(v, this.node.worldPosition, this.node.forward);geometry.Ray.fromPoints(ray, this.node.worldPosition, v);if (PhysicsSystem.instance.raycastClosest(ray, 0xffffffff)) {//法线this.dirNd_1.setWorldPosition(PhysicsSystem.instance.raycastClosestResult.hitPoint);Quat.fromViewUp(quat_0, PhysicsSystem.instance.raycastClosestResult.hitNormal);Quat.rotateY(quat_0, quat_0, Math.PI);this.dirNd_1.setRotation(quat_0);//出射this.dirNd_2.setWorldPosition(PhysicsSystem.instance.raycastClosestResult.hitPoint);const vector_n = PhysicsSystem.instance.raycastClosestResult.hitNormal;const vector_i = this.node.forward;this.dir.set(vector_i.subtract(vector_n.multiplyScalar(2 * vector_i.dot(vector_n))));this.dir.normalize();Quat.fromViewUp(quat_0, this.dir);Quat.rotateY(quat_0, quat_0, Math.PI);this.dirNd_2.setRotation(quat_0);}}