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

};

相关推荐
雪儿waii30 分钟前
Unity 中的 InvokeRepeating 详解
unity·游戏引擎
mxwin41 分钟前
Unity Shader 程序化生成:Shader 中的数学宇宙
unity·游戏引擎
雪儿waii2 小时前
Unity 中的 Quaternion(四元数)详解
unity·游戏引擎
RReality2 小时前
【Unity UGUI】ScrollRect 与 Scrollbar 深度用法
unity·游戏引擎
人邮异步社区2 小时前
如何自学游戏引擎的开发?
unity·程序员·游戏引擎
mxwin17 小时前
Unity URP 热更新兼容性:Shader 在 IL2CPP 打包下的注意事项
unity·游戏引擎
人机与认知实验室19 小时前
如何用四维矩阵建模计算性的态势感知与算计性的势态知感?
人工智能·线性代数·矩阵
Jasmine_llq21 小时前
《B4037 [GESP202409 二级] 小杨的 N 字矩阵》
线性代数·顺序输入输出算法·双重循环遍历算法·条件分支判断算法·边界字符输出算法·对角线定位算法·逐行输出控制算法
mxwin1 天前
Unity shader中TransformWorldToShadowCoord原理解析
unity·游戏引擎·shader
mxwin1 天前
Unity Shader 中 ShadowCaster的作用和疑问
unity·游戏引擎