zoukankan      html  css  js  c++  java
  • 3d数学总结帖

    3d数学总结帖,以下是对3d学习过程中数学知识的简单总结

    • 角度值和弧度制的互转
    1. Deg2Rad 角度A1转弧度A2 => A2=A1*PI/180
    2. Rad2Deg 弧度A2转换角度A1 => A1=A2*180/PI
    • u3d中Math.Infinity表示正无穷大,不代表任何具体数值,不能用于具体数值计算中。
      Math.Infinity /Math.Infinity = NaN( Not a Number)
    • u3d中(左手坐标系),绕坐标轴按顺时针旋转角度为正值,按逆时针旋转角度为负值。(待验证)
    • 已知当前点为Target,目标点沿着Target的Y轴旋转45度,沿着自身X轴延伸4米求目标点的3D坐标。
    // 1. 已知当前点为Target,目标点沿着Target的Y轴旋转45度,沿着自身X轴延伸4米求目标点的3D坐标
    	void Test1()
    	{
    		Quaternion rot = Quaternion.Euler(0,45,0) * m_target.rotation;
    		Vector3 destPos = rot * new Vector3(4,0,0);
    		Debug.DrawLine(m_target.position,destPos,Color.red);
    		transform.rotation = rot;
    		transform.position = destPos;
    
    		Debug.Log("newPos = " + destPos + " targetPos = " +  m_target.position
    		          + " ditance = " + Vector3.Distance(destPos,m_target.position));
    	}
    
    • 向量点乘相关dotProduct
    1. 满足交换律
    2. dot(a,b) = |a|*|b|cos(A)
    3. 几何意义:点乘结果越大,两个向量越接近。
    4. 结果dot > 0 表示两个向量夹角在[0,90)之间,方向相同。
    5. 结果dot = 0 表示两个向量夹角为90度,相互垂直正交。
    6. 结果dot < 0 表示两个向量夹角为(90,180]度,方向相反。
    • 向量叉乘crossProduct
    1. 不满足交换律 a x b = - b x a
    2. a x b = |a|*|b|sin(A)
    3. 叉乘得到的向量垂直于原来的两个向量。
    4. 叉乘方向的判断
        //计算两个向量ab的法向量的方向
    	void Test4()
    	{
    		Quaternion r0 = transform.rotation;
    		
    		// r0 * Vector3.forward  计算物体朝向的单位向量
    		//Quaternion r1 = Quaternion.Euler(0,viewAngle,0) * transform.rotation;
    		//Quaternion r2 = Quaternion.Euler(0,-viewAngle,0) * transform.rotation;
    		
    		//make it faster
    		Quaternion r1 = Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + viewAngle,transform.rotation.eulerAngles.z);
    		Quaternion r2 = Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - viewAngle,transform.rotation.eulerAngles.z);
    		
    		
    		Vector3 dest = transform.position + r0 * Vector3.forward * distance;
    		Vector3 va = transform.position + r1* Vector3.forward * distance;
    		Vector3 vb = transform.position + r2 * Vector3.forward * distance;
    
    		Debug.DrawLine(transform.position,va,Color.blue);
    		Debug.DrawLine(transform.position,vb,Color.red);
    
    		//在左手坐标系下,在XZ平面上忽略Y轴,判断向量a和向量b的方位(a在b的顺时针方向还是逆时针方向)
    		//可以通过向量axb的叉乘结果法向量normal的方向来判断。
    		// 如果normal.y > 0 : b在a的顺时针方向
    		// 如果normal.y < 0 : b在a的逆时针方向
    		// 如果normal.y = 0 : b和a方向相同
    		// 右手坐标系正好相反
    		//计算法向量
    		Vector3 normal = Vector3.Cross(va,vb).normalized * 5;   // normal.y < 0  
    		//Vector3 normal = Vector3.Cross(vb,va).normalized * 5;  // normal.y > 9
    		Debug.DrawLine(transform.position,transform.position + normal,Color.yellow);
    		
    
    	}
    

    其中蓝色为向量a,红色为向量b,ab所在平面的法向量y<0

    代码链接

  • 相关阅读:
    内存映射和独立存贮器
    Elastic Stack简介和Elasticsearch--先搞清楚概念第二篇
    终于有人把Elasticsearch原理讲透了!学习的第一篇总览全局
    Java对象的序列化和反序列化
    java类里的成员变量是自身的对象问题
    Maven多模块的2种依赖管理策略
    双重检查锁单例模式为什么要用volatile关键字?
    Maven pom中的 scope 详解
    IntelliJ IDEA 内置数据库管理工具实战
    docker安装mysql5.7
  • 原文地址:https://www.cnblogs.com/beeasy/p/6236121.html
Copyright © 2011-2022 走看看