Unity—3D数学基础

2023-11-05

今天用了小半天时间初步了解3D数学基础!明天开始进入unity游戏脚本编写!

每日一句:“人间骄阳正好 风过林梢 彼时我们正当年少”

目录

3D坐标系:

·全局(世界)坐标系:

·局部(模型、物体)坐标系:

·相机坐标系:

·屏幕坐标系:

向量

向量的运算:

Vector3类

Vector3应用:

·计算两物体间的距离

·缓动效果

齐次坐标

四元数

坐标转换原理

世界坐标与局部坐标的转换:改变全局和局部坐标

世界坐标与屏幕坐标的转换:设置世界坐标

·如何通过鼠标单击来设置物体的世界坐标位置


3D坐标系:

·全局(世界)坐标系:

描述游戏场景内所有物体位置和方向的基准

Hierrarchy视图中Position属性为(1,2,3)表示它距离全局坐标系原点在x轴方向上有1个单位坐标,在y轴方向上有2个单位坐标,在z轴方向上有3个单位坐标

当游戏对象父物体时,其Hierrarchy视图中Position显示为局部坐标,当游戏对象父物体时,其Hierrarchy视图中Position显示既是局部坐标也是全局坐标

·局部(模型、物体)坐标系

每个物体都有其独立的物体坐标系,并且随物体进行移动或者旋转

模型mesh保存的顶点坐标均为局部坐标系下的坐标

父子物体的坐标系是关联的,子物体会以父物体的某一坐标点为自身的坐标原点

·相机坐标系:

根据观察位置和方向建立的坐标系

判断物体是否在相机前方,以及物体之间的先后遮挡顺序

·屏幕坐标系:

建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置,其中原点位置(0,0)在屏幕左下角

向量

用于描述具有大小和方向两个属性的物理量

向量的运算:

·加减

·数乘

向量与一个标量相乘

·点乘

两个向量点乘得到一个标量,数值等于两个向量长度相乘后再乘以二者夹角的余弦值

·叉乘

两个向量的叉乘得到一个新的向量,新向量垂直于原来的两个向量,并且长度等于原向量长度相乘后再乘夹角的正弦值

Vector3类

Vector3成员变量

Vector3方法

 

Vector3应用:

·计算两物体间的距离

public class Distance : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform objTrans1;
    public Transform objTrans2;
    void Start()
    {
        float dis = Vector3.Distance(objTrans1.position, objTrans2.position);
        Debug.Log("Distance:" + dis);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

(Debug.Log将消息记录到Unity控制台)

将脚本绑定给场景中的主相机Main Camera,然后再Inspector视图中objTrans1objTrans2指定为2个cube

运行、CTRL+SHIFT+C调出控制台

·缓动效果

Vector3.Lerp方法

让物体从当前位置移动到坐标系下的坐标另一个位置的缓动效果

public class MoveToTarget : MonoBehaviour
{
    public Transform endTrans;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    // Update is called once per frame
    void Update()
    {
        transform.position = Vector3.Lerp(transform.position, endTrans.position, Time.deltaTime);
    }
}

Time.deltaTime 表示 Update() 方法上完成上一帧所用的时间

将脚本绑定给场景中的Cube上,然后在其Inspector视图中将endTrans指定为Cube(1)

齐次坐标

将原本三维的向量(x,y,z)用四维向量(wx,wy,wz,w)来表示

引入目的

更好地区分向量和点;

统一用矩阵乘法表示平移、旋转、缩放变换

当分量w=0时可以用来表示无穷远的点

四元数

包含一个标量分量和一个三维向量分量,四元数Q记作Q=[w,(x,y,z)]

在游戏对象的 Transform 组件中,变量 Transform.rotation 为对象在全局坐标系下的旋转;变量 Transform.localRotation 为对象在父对象的局部坐标系下的旋转

应用:通过四元数控制对象旋转

坐标转换原理

世界坐标与局部坐标的转换:改变全局和局部坐标

ransform 组件的 Transform.TransformPoint 方法可以将坐标点从局部坐标系转换到全局坐标系,Transform.InverseTransformPoint 方法可以将坐标点从全局坐标系转换到局部坐标系

世界坐标与屏幕坐标的转换:设置世界坐标

在 Unity 中,由于屏幕的画面是由相机(Camera)所呈现的,所以世界坐标和屏幕坐标之间的转换需要以相机为媒介

·如何通过鼠标单击来设置物体的世界坐标位置

新建 C# 脚本

public class ScreenToWorldPoint : MonoBehaviour
{
    Vector3 screenPos;
    // Start is called before the first frame update
    void Start()
    {
        screenPos = Camera.main.WorldToScreenPoint(transform.position);
        //打印坐标信息
        Debug.Log("屏幕坐标:" + screenPos);
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            //获取鼠标的位置坐标
            Vector3 mousePos = Input.mousePosition;
            //将物体屏幕坐标的z轴值赋值给鼠标坐标的z轴
            mousePos.z = screenPos.z;
            //将屏幕坐标换成世界坐标
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
            //设置物体位置
            transform.position = worldPos;
        }
    }
}

将脚本绑定到 Cube 立方体上

当运行开始时,控制台中会输出该 Cube 的世界坐标转换成屏幕的坐标;当鼠标指针在 Game 视图,单击左键时,可以看到Cube 的位置会跟随鼠标指针的位置移动

世界坐标转换成屏幕坐标后,屏幕坐标的 z 轴大于 0,则说明该坐标在相机前方,反之,则说明该坐标在相机后方

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity—3D数学基础 的相关文章

  • glkView:drawInRect: 和 glkViewControllerUpdate: 之间的区别? OpenGL ES 2 - iOS

    在我的渲染循环中 这两种方法之间的目的应该有什么区别 苹果有话要说 关于更新 视图控制器调用其委托的 glkViewControllerUpdate 方法 您的代理应该更新不涉及将结果渲染到屏幕的帧数据 关于绘制矩形 GLKView 对象使
  • 在python opengl中使用图像中的2d点获取空间中的3d点

    我正在尝试模拟房间中的深度相机 我的相机能够在世界中移动和旋转 并且房间被模拟为围绕 0 0 0 的 3d 立方体 单击按钮时 我想对图像中的 N 个随机点进行采样 并获取这些点与相机的距离 现实世界 中的距离 到目前为止 我已经成功创建了
  • 矩形相交

    是否有任何已知的方法来计算两个矩形之间的相交矩形 我的意思是 如果矩形 A 由 x1 y2 x2 y2 定义 B 由 x3 y3 x4 y4 定义 那么如何计算相交矩形 C x5 y5 x6 y6 的坐标 Thanks 相交多边形的一般问题
  • 根据表面包围的 3D 区域将表面分配给区域

    给定三维空间中的一组曲面 我尝试将每个曲面分配给一个区域 该区域引用该组所包围的最小 3D 区域 或者如果不适用则不指定任何区域 我还想确定一个表面是否是两个区域之间的界面 因此 例如 如果我们有 11 个表面 代表两个堆叠在一起的立方体
  • Python openAL 3D 声音

    我刚刚开始使用 python 正在制作音频操作程序 我正在尝试在我的 python 应用程序中使用 openAL 实现 3D 声音 但我只能让它工作 这是我的 3D 声音代码 from openal loaders import load
  • 用于平滑开放 3D 网格边缘的算法

    我有一个 3D 网格 它代表一个具有一些粗糙边界的表面 我想对其进行平滑处理 我使用半边数据结构来存储几何图形 因此我可以轻松地迭代边界边 顶点和面 我还可以使用点积和叉积轻松确定给定的一对边是否是凸 凹的 平滑边缘的最佳方法是什么 使它们
  • 实现3d索贝尔算子

    我目前正在研究从包含体素的 MRI 数据量中去除不均匀性 我想在这些体积上应用索贝尔运算符来找到梯度 我熟悉二维索贝尔掩模和二维图像的邻域 索贝尔面具 1 2 1 0 0 0 1 2 1 1 0 1 2 0 2 1 0 1 x y 的邻域
  • R - hist3D 序列颜色和标签问题

    所以我有一个 5 行 20 列的数据集 我正在尝试绘制一个hist3D来自plot3D包裹 dt structure c 1 1 1 3 1 2 1 0 2 1 2 1 0 1 1 0 1 0 2 2 1 1 1 1 4 4 1 1 2 3
  • 给定表面法线,找到 3D 平面的旋转

    所以我有一个由 2 个向量描述的 3D 平面 P 位于平面上的点N 平面的表面法线 我有一个非常大的扁平方形多边形 我想渲染它来代表这个平面 我可以轻松地将多边形平移到给定点 但随后我需要找到适当的旋转来应用以使表面法线实际上成为表面法线
  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • Blender 与 Unity [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将球体上的 3d 点转换为 UV 坐标

    我在球体上有一个 3d 点 想要将其转换为球体纹理上的 UV 点 有人可以指出正确的方向吗 我可以采用纯数学解决方案 Edit 我目前有这个 它不会返回正确的 UV 坐标 p 是球体上的 3d 点 mesh position 是球体的位置
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • 如何在plotly 3D曲面图中标记区域?

    我使用plotly从xyz数据创建3D高程剖面图 它与以下代码配合得很好 import plotly graph objects as go import pandas as pd import numpy as np Read data
  • 从 NumPy 数组中的数据绘制 3D 图像

    我有一个 NumPy 数组中的数据文件 我想查看 3D 图像 我正在分享一个示例 我可以在其中查看大小为 100 100 的 2D 图像 这是 xy 平面上 z 0 处的切片 import numpy as np from matplotl
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt

随机推荐