C#XNA中实现自定义3x3矩阵类:MMatrix33
作者:致力于流浪动物救助量 | 来源:互联网 | 2024-12-21 17:27
本文介绍了如何在C#和XNA框架中实现一个自定义的3x3矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了AS3Starling和其他相关资源,以确保算法的准确性和高效性。
为了更好地理解和应用 3x3 矩阵的运算,本文详细描述了 MMatrix33 类的实现过程。通过借鉴 AS3 Starling 和网络上的相关资源,我们实现了多种矩阵操作,如缩放、位移、旋转和扭曲等。 最终目标是通过深入研究矩阵运算,进一步探索 Cocos2d-xna(WP7)版源码,并最终构建一个轻量级的 2D 渲染框架。 以下是 MMatrix33 类的完整代码实现: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; namespace Base.MyMath { /// /// 3x3 矩阵类 /// Author: Jave.Lin /// Date: 2013-08-30 /// public struct MMatrix33 { // 矩阵元素 public float m11, m12, m13; public float m21, m22, m23; public float m31, m32, m33; // 构造函数 public MMatrix33() { m11 = m22 = m33 = 1; m12 = m13 = m21 = m23 = m31 = m32 = 0; } // 单位化矩阵 public void Identity() { MMatrix33.Identity(ref this); } // 旋转矩阵 public void Rotate(float rotation) { MMatrix33.Rotate(ref this, rotation); } // 根据方向旋转矩阵 public void RotateByV(Vector2 fwd, Vector2 side) { MMatrix33.RotateByV(ref this, fwd, side); } // 矩阵相乘 public void Multiply(MMatrix33 m) { MMatrix33.Multiply(ref this, m); } // 位移矩阵 public void Translate(Vector2 v) { MMatrix33.Translate(ref this, v); } // 缩放矩阵 public void Scale(float s) { MMatrix33.Scale(ref this, s); } // 根据水平、垂直缩放 public void ScaleXY(float scaleX, float scaleY) { MMatrix33.ScaleXY(ref this, scaleX, scaleY); } // 根据指定的向量缩放 public void ScaleByV(Vector2 v) { MMatrix33.ScaleByV(ref this, v); } // 扭曲矩阵 public void Skew(float skewX, float skewY) { MMatrix33.Skew(ref this, skewX, skewY); } // 复制矩阵 public MMatrix33 Copy() { return MMatrix33.Copy(this); } // 将所有指定的Vector2向量都应用指定的matrix坐标转换 public static void TransformVector2Arr(MMatrix33 matrix, ref Vector2[] vecArr) { for (int i = 0; i { TransformVector2(matrix, ref vecArr[i]); } } // 将指定的Vector2向量应用指定的matrix坐标转换 public static void TransformVector2(MMatrix33 matrix, ref Vector2 v) { v.X = matrix.m11 * v.X + matrix.m21 * v.Y + matrix.m31; v.Y = matrix.m12 * v.X + matrix.m22 * v.Y + matrix.m32; } // 单位化矩阵 public static void Identity(ref MMatrix33 matrix) { matrix.m11 = 1; matrix.m12 = 0; matrix.m13 = 0; matrix.m21 = 0; matrix.m22 = 1; matrix.m23 = 0; matrix.m31 = 0; matrix.m32 = 0; matrix.m33 = 1; } // 旋转矩阵 public static void Rotate(ref MMatrix33 matrix, float rotation) { MMatrix33 m = getM(); float sin = (float)Math.Sin(rotation); float cos = (float)Math.Cos(rotation); m.m11 = cos; m.m12 = sin; m.m13 = 0; m.m21 = -sin; m.m22 = cos; m.m23 = 0; m.m32 = 0; m.m32 = 0; m.m33 = 1; MMatrix33.Multiply(ref matrix, m); MMatrix33.PushM(m); } // 根据指定的方向向量旋转矩阵 public static void RotateByV(ref MMatrix33 matrix, Vector2 fwd, Vector2 side) { MMatrix33 m = getM(); m.m11 = fwd.X; m.m12 = fwd.Y; m.m13 = 0; m.m21 = side.X; m.m22 = side.Y; m.m23 = 0; m.m32 = 0; m.m32 = 0; m.m33 = 1; MMatrix33.Multiply(ref matrix, m); MMatrix33.PushM(m); } // 矩阵相乘 public static void Multiply(ref MMatrix33 matrix, MMatrix33 m) { // 第一行 matrix.m11 = matrix.m11 * m.m11 + matrix.m12 * m.m21 + matrix.m13 * m.m31; matrix.m12 = matrix.m11 * m.m12 + matrix.m12 * m.m22 + matrix.m13 * m.m32; matrix.m13 = matrix.m11 * m.m13 + matrix.m12 * m.m23 + matrix.m13 * m.m33; // 第二行 matrix.m21 = matrix.m21 * m.m11 + matrix.m22 * m.m21 + matrix.m23 * m.m31; matrix.m22 = matrix.m21 * m.m12 + matrix.m22 * m.m22 + matrix.m23 * m.m32; matrix.m23 = matrix.m21 * m.m13 + matrix.m22 * m.m23 + matrix.m23 * m.m33; // 第三行 matrix.m31 = matrix.m31 * m.m11 + matrix.m32 * m.m21 + matrix.m33 * m.m31; matrix.m32 = matrix.m31 * m.m12 + matrix.m32 * m.m22 + matrix.m33 * m.m32; matrix.m33 = matrix.m31 * m.m13 + matrix.m32 * m.m23 + matrix.m33 * m.m33; } // 矩阵根据指定量的Vector2向量位移 public static void Translate(ref MMatrix33 matrix, Vector2 v) { MMatrix33 m = getM(); m.m11 = 1; m.m12 = 0; m.m13 = 0; m.m21 = 0; m.m22 = 1; m.m23 = 0; m.m32 = v.X; m.m32 = v.Y; m.m33 = 1; MMatrix33.Multiply(ref matrix, m); } // 缩放矩阵 public static void Scale(ref MMatrix33 matrix, float scale) { MMatrix33.ScaleXY(ref matrix, scale, scale); } // 根据指定的水平、垂直缩放 public static void ScaleXY(ref MMatrix33 matrix, float scaleX, float scaleY) { matrix.m11 *= scaleX; matrix.m12 *= scaleX; matrix.m21 *= scaleY; matrix.m22 *= scaleY; } // 根据指定的向量缩放 public static void ScaleByV(ref MMatrix33 matrix, Vector2 v) { MMatrix33.ScaleXY(ref matrix, v.X, v.Y); } // 扭曲矩阵 public static void Skew(ref MMatrix33 matrix, float skewX, float skewY) { float sinX = (float)Math.Sin(skewX); float cosX = (float)Math.Cos(skewX); float sinY = (float)Math.Sin(skewY); float cosY = (float)Math.Cos(skewY); matrix.m11 = matrix.m11 * cosY - matrix.m12 * sinX; matrix.m12 = matrix.m11 * sinY + matrix.m12 * cosX; matrix.m21 = matrix.m21 * cosY - matrix.m22 * sinX; matrix.m22 = matrix.m21 * sinY + matrix.m22 * cosX; matrix.m31 = matrix.m31 * cosY - matrix.m32 * sinX; matrix.m32 = matrix.m31 * sinY + matrix.m32 * cosX; } // 复制对象 public static MMatrix33 Copy(MMatrix33 m) { return (MMatrix33)m.MemberwiseClone(); } // 临时矩阵池 private static Queue mPool = new Queue(); // 获取临时矩阵(出队) private static MMatrix33 getM() { return mPool.Count > 0 ? mPool.Dequeue() : new MMatrix33(); } // 回收临时矩阵(入队) private static void PushM(MMatrix33 m) { m.Identity(); mPool.Enqueue(m); } } } ```
推荐阅读
本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ...
[详细]
蜡笔小新 2024-12-27 10:28:40
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ...
[详细]
蜡笔小新 2024-12-28 08:44:35
本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ...
[详细]
蜡笔小新 2024-12-27 03:39:09
Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ...
[详细]
蜡笔小新 2024-12-28 09:44:49
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ...
[详细]
蜡笔小新 2024-12-27 15:26:10
本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ...
[详细]
蜡笔小新 2024-12-27 15:04:09
本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ...
[详细]
蜡笔小新 2024-12-27 13:34:19
本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ...
[详细]
蜡笔小新 2024-12-27 13:10:20
学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ...
[详细]
蜡笔小新 2024-12-26 20:04:36
本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ...
[详细]
蜡笔小新 2024-12-26 19:26:18
本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ...
[详细]
蜡笔小新 2024-12-26 18:47:12
本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ...
[详细]
蜡笔小新 2024-12-26 16:33:40
题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!----- ...
[详细]
蜡笔小新 2024-12-26 15:55:56
致力于流浪动物救助量
这个家伙很懒,什么也没留下!