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数学基础 的相关文章

  • 基于 Q3DScatter 的自定义图表,QCustom3DItem 运行缓慢

    我想制作一个带条形的 3D 图表 条形颜色取决于其大小 两个都Qt 条形图和散点图类型 https doc qt io qt 5 qtdatavisualization overview html接近我正在寻找的东西 我最终创建了一个基于的
  • 对一系列点重新采样

    我有一个 3d 点数组 想象一下球的轨迹 有 X 个样本 现在 我想对这些点重新采样 以便我有一个新数组 其中包含 y 个样本的位置 y 可以大于或小于 x 但不能小于 1 始终至少有 1 个样本 将原始数组重新采样为新数组的算法会是什么样
  • 如何在 Three.js 中从三角面获取多边形?

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

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • Direct3D 中的矩阵多阶

    关于在 Direct3D 中乘法矩阵以获得结果 我收到了两个相互矛盾的答案 教程确实规定从左到右相乘 这很好 但这不是我想象的方式 这是一个例子 OpenGL 从上到下阅读 GLRotatef 90 0f GLTranslatef 20 0
  • 3D 空间:使用鼠标指针沿着对象指向的方向

    给定相机面向的方向的 3D 向量以及 3D 空间中 3D 对象的方位 方向向量 如何计算鼠标指针在屏幕上必须遵循的 2 维斜率 以便在视觉上沿着所述物体的方向移动 基本上 我希望能够单击箭头并通过拖动它来使其前后移动 但前提是鼠标指针沿着箭
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 如何使用 matplotlib 将 3d 数据单位转换为显示单位?

    这可能有点疯狂 但我正在尝试使用 matplotlib v1 1 0 创建 3d 散点图的可点击图像图 我已经阅读了如何对二维图进行操作 参见这个博客 http hackmap blogspot com 2008 06 pylab matp
  • 在 Unity 中平滑动态生成的网格?

    给定 Unity 和 C 中的网格 其本身是通过合并更简单的基础网格实时创建的 我们如何在运行时 将其变成平滑的 几乎像包裹在布中的网格版本一样 不是完全凸出的版本 而是更圆润 软化锋利的边缘 桥接深间隙等 理想情况下 表面也将像 平滑角度
  • 3D 透视投影的剪辑矩阵

    我正在尝试创建一个简单的 3D 图形引擎 并找到并使用了我在这里找到的方程 http en wikipedia org wiki 3D projection cite note 0 http en wikipedia org wiki 3D
  • React-Three-Fiber:JSON 中位置 3 出现意外标记 c 错误

    我正在尝试使用 React Three Fiber 加载 glb 文件 但出现以下错误 Error Unexpected token c in JSON at position 3 我不确定我做错了什么 看来此问题最常见的解决方案是将 gl
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9

随机推荐