3d游戏引擎的math矩阵实现

1.Math.h

#pragma once

#include "CommonHeaders.h"

#include "MathTypes.h"

#include "PrimitiveTypes.h"

namespace primal::math

{

template<typename T>

constexpr T clamp(T value, T min, T max)

{

return (value < min) ? min : (value > max) ? max : value;

}

template<u32 bits>

constexpr u32 pack_unit_float(f32 f)

{

static_assert(bits <= sizeof(u32) * 8);

assert(f >= 0.f && f <= 1.f);

constexpr f32 intervals{ (f32)((1ui32 << bits) - 1) };

return (u32)(intervals * f + 0.5f);

}

template<u32 bits>

constexpr f32 unpack_to_unit_float(u32 i)

{

static_assert(bits <= sizeof(u32) * 8);

assert(i < (1ui32)<<bits);

constexpr f32 intervals{ (u32)((1ui32 << bits) - 1) };

return (f32)i / intervals;

}

template<u32 bits>

constexpr u32 pack_float(f32 f, f32 min, f32 max)

{

assert(min < max);

assert(f <= max && f >= min);

const f32 distance{(f - min) / (max - min)};

return pack_unit_float<bits>(distance);

}

template<u32 bits>

constexpr f32 unpack_to_float(u32 i, f32 min, f32 max)

{

assert(min < max);

return unpack_to_unit_float<bits>(i) * (max - min) + min;

}

}

MathTypes.h

#pragma once

#include "CommonHeaders.h"

#include "DirectXMath.h"

namespace primal::math

{

constexpr float pi = 3.14f;

//constexpr float pi = 2.f * pi;

constexpr float epsilon = 1e-5f;

#if defined(_WIN64)

/*

typedef const DirectX& XMFLOAT2;

typedef const DirectX& XMFLOAT2A;

typedef const DirectX& XMFLOAT3;

typedef const DirectX& XMFLOAT3A;

typedef const DirectX& XMFLOAT4;

typedef const DirectX& XMFLOAT4A;

typedef const DirectX& XMUINT2;

typedef const DirectX& XMUINT3;

typedef const DirectX& XMUINT4;

typedef const DirectX& XMINT2;

typedef const DirectX& XMINT3;

typedef const DirectX& XMINT4;

typedef const DirectX& XMFLOAT3X3;

typedef const DirectX& XMFLOAT4X4;

typedef const DirectX& XMFLOAT4X4A;

*/

using v2 = DirectX::XMFLOAT2;

using v2a = DirectX::XMFLOAT2A;

using v3 = DirectX::XMFLOAT3;

using v3a = DirectX::XMFLOAT3A;

using v4 = DirectX::XMFLOAT4;

using v4a = DirectX::XMFLOAT4A;

using u32v2 = DirectX::XMUINT2;

using u32v3 = DirectX::XMUINT3;

using u32v4 = DirectX::XMUINT4;

using s32v2 = DirectX::XMINT2;

using s32v3 = DirectX::XMINT3;

using s32v4 = DirectX::XMINT4;

using m3x3 = DirectX::XMFLOAT3X3;

using m4x4 = DirectX::XMFLOAT4X4;

using m4x4a = DirectX::XMFLOAT4X4A;

#endif

};

相关推荐
我的offer在哪里12 小时前
示例 Unity 项目结构(Playable Game Template)
unity·游戏引擎
啵啵鱼爱吃小猫咪13 小时前
机械臂能量分析
线性代数·机器学习·概率论
淡海水14 小时前
【节点】[Branch节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·branch
Physicist in Geophy.15 小时前
从矩阵到函数(算子理论)
矩阵·math
Physicist in Geophy.16 小时前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
AI科技星17 小时前
从ZUFT光速螺旋运动求导推出自然常数e
服务器·人工智能·线性代数·算法·矩阵
_OP_CHEN17 小时前
【算法基础篇】(五十八)线性代数之高斯消元法从原理到实战:手撕模板 + 洛谷真题全解
线性代数·算法·蓝桥杯·c/c++·线性方程组·acm/icpc·高斯消元法
Zik----17 小时前
简单的Unity漫游场景搭建
unity·游戏引擎
独断万古他化18 小时前
【算法通关】前缀和:和为 K、和被 K整除、连续数组、矩阵区域和全解
算法·前缀和·矩阵·哈希表
3GPP仿真实验室1 天前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵