美文网首页
Unity中怎么表示一个平面

Unity中怎么表示一个平面

作者: 光棍狗没有可持续发展 | 来源:发表于2018-08-16 11:18 被阅读0次

先看一下平面方程的推导:


QQ图片20180816105821.png

由最后的公式可得,A,B,C是法线向量x0,y0,z0是平面上任一点,d常量(匡红的部分)是法线和已知点的点乘取反。所以,设已知平面Transform为surface,表示该平面方程的方法为:
Vector3 pos = surface.position;
Vector3 normal = surface.up;
float d = -Vector3.Dot(normal, pos) ;
Vector4 plane = new Vector4(normal.x, normal.y, normal.z, d);
对比一下AngryBots中地面反射的平面方程:
private void RenderReflectionFor (Camera cam, Camera reflectCamera)
{
if(!reflectCamera)
return;

    SaneCameraSettings(reflectCamera);
    
    reflectCamera.backgroundColor = clearColor;             
                        
    GL.SetRevertBackfacing(true);       
                        
    Transform reflectiveSurface = reflectiveSurfaceHeight;
        
    Vector3 eulerA = cam.transform.eulerAngles;
                
    reflectCamera.transform.eulerAngles = new Vector3(-eulerA.x, eulerA.y, eulerA.z);
    reflectCamera.transform.position = cam.transform.position;
            
    Vector3 pos = reflectiveSurface.position;
    pos.y = reflectiveSurface.position.y;
    Vector3 normal = reflectiveSurface.up;
    float d = -Vector3.Dot(normal, pos) - clipPlaneOffset;
    Vector4 reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d);
            
    Matrix4x4 reflection = Matrix4x4.zero;
    reflection = CalculateReflectionMatrix(reflection, reflectionPlane);        
    oldpos = cam.transform.position;
    Vector3 newpos = reflection.MultiplyPoint (oldpos);
                    
    reflectCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection;
            
    Vector4 clipPlane = CameraSpacePlane(reflectCamera, pos, normal, 1.0f);
            
    Matrix4x4 projection =  cam.projectionMatrix;
    projection = CalculateObliqueMatrix(projection, clipPlane);
    reflectCamera.projectionMatrix = projection;
    
    reflectCamera.transform.position = newpos;
    Vector3 euler = cam.transform.eulerAngles;
    reflectCamera.transform.eulerAngles = new Vector3(-euler.x, euler.y, euler.z);  

    reflectCamera.RenderWithShader (replacementShader, "Reflection");           
    
    GL.SetRevertBackfacing(false);                  
}

构建一个平面方程就是这么简单。

相关文章

  • Unity中怎么表示一个平面

    先看一下平面方程的推导: 由最后的公式可得,A,B,C是法线向量x0,y0,z0是平面上任一点,d常量(匡红的部分...

  • Unity创建多边形网格

    在Unity编辑器中,我们可以很容易地就创建一个3D平面,但是有时候我们想自己能动态创建一个平面,但是只能...

  • Unity3D中Layers和LayerMask解析

    Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。在Unity中可...

  • 空间平面和直线

    在空间直角坐标系里面怎么表示平面?古人曾说,空间中只要一个点和平面的法向量确定了,那么这个平面就确定了。 一个点的...

  • 垂直于任意平面的拖动

    毕竟重要的是VerticalPlane这个平面,你可以直接在Unity中创建一个Quad。然后拉到这个代码里面。V...

  • 欧拉角旋转矩阵内外旋的等价性

    下文中, 绕坐标轴 旋转角度 的旋转矩阵表示为 , 其中 . Unity 中, 欧拉角 表示的旋转顺序是 ...

  • unity3d 概述

    unity3d版本号 unity 5.x以后的版本,取消以数字命名的版本规则,采用年份表示。新的版本发布计划中包括...

  • 3D max导出问题

    怎么把VR材质导出到Unity3D中

  • 欧拉角与四元数

    利用二元数(复数)表示一维平面的旋转;利用四元数表示三维平面的旋转。Understanding Quaternio...

  • Swift中 const 怎么表示

    在 OC 中 定义的 不可变 的静态变量通常是 static NSString * const kAuthToke...

网友评论

      本文标题:Unity中怎么表示一个平面

      本文链接:https://www.haomeiwen.com/subject/vkynbftx.html