cocos creator_计算反射向量

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);}}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部