[3D数学基础:图形与游戏开发]读书笔记 第3、5、6、7章(多坐标系、向量运算、3D向量类、矩阵)


第1章 简介

第2章 笛卡尔坐标系

第4章 向量

这几章没讲什么,主要是一些基础概念,有兴趣的自己看

第3章 多坐标系

  • 惯性坐标系 原点在物体坐标系,方向和世界坐标系平行
  • 为什么要关心坐标系 从物体坐标系到关系坐标系只需要旋转,从惯性坐标系到世界坐标系只需要平移
  • 坐标系的转换 平常我将具体点进行坐标变换,这里进行了物体坐标轴的变换,这样有个好处使用于整个物体所有的点

第5章 向量运算

  • 向量点乘(内积) 结果如下 a ⃗ ⋅ b ⃗ = ∣ a ∣ ∣ b ∣ c o s θ \vec a \cdot \vec b = |a| |b|cos\theta a b =abcosθ
  • 向量的投影 给定2个向量v、n,v可以分解为平行于n的向量垂直于n的向量 一般称平行于n的向量为v在n的投影 推导出来的公式如下
  • 向量的叉乘 a ⃗ × b ⃗ = ∣ a ∣ ∣ b ∣ s i n θ \vec a \times \vec b = |a| |b|sin\theta a ×b =absinθ 可以得到垂直于a和b的一个向量
    怎样确定叉乘方向? 2个向量首尾相连,左手坐标系,顺时针则指向自己,逆时针则远离自己,右手坐标系相反

3D向量类

  • 下面是C#简单的实现(原文是用C++写的)
    public struct Vector3
    {
        float _x, _y, _z;

        public Vector3(float x, float y, float z)
        {
            _x = x;
            _y = y;
            _z = z;
        }

        // 其他重载运算符省略
        public static Vector3 operator+(Vector3 v3_1, Vector3 v3_2)
        {
            return new Vector3(v3_1._x + v3_2._x, v3_1._y + v3_2._y, v3_1._z + v3_2._z);
        }

        /// <summary>
        /// 归一化
        /// </summary>
        public void Normalize()
        {
            var magSq = _x * _x + _y * _y + _z * _z;
            if(magSq > 0f)
            {
                float oneOverMag = 1f / (float)Math.Sqrt(magSq);
                _x *= oneOverMag;
                _y *= oneOverMag;
                _z *= oneOverMag;
            }
        }

        /// <summary>
        /// 求模长
        /// </summary>
        /// <returns></returns>
        public float Mag()
        {
            return (float)Math.Sqrt(_x * _x + _y * _y + _z * _z);
        }

        /// <summary>
        /// 叉乘
        /// </summary>
        public static Vector3 Cross(Vector3 v1, Vector3 v2)
        {
            return new Vector3(
                v1._y * v2._z - v1._z * v2._y,
                v1._z * v2._x - v1._x * v2._z,
                v1._x * v2._y - v1._y * v2._x
                );
        }

        public static float Distance(Vector3 v1, Vector3 v2)
        {
            float dx = v2._x - v1._x;
            float dy = v2._y - v1._y;
            float dz = v2._z - v1._z;
            return (float)Math.Sqrt(dx + dy + dz);
        }
    }

矩阵

  • 方阵 行列数相同的矩阵,方阵元素下标行列相同的元素
  • 对角矩阵 方阵的非对角元素都为0
  • 单位矩阵 对角矩阵的对角元素都为1
  • 转置 转置矩阵的行是原矩阵的列,列是原矩阵的行
    转置矩阵的转置矩阵是原矩阵
    对角矩阵的转置矩阵还是原矩阵
  • 矩阵乘法,书上有个方便计算的格式
  • 如何具化矩阵
    将矩阵分别看为基向量,然后将会在2D表现出成L形状,3D将会表现为三角架,这样更方便理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值