开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1075|回复: 4
收起左侧

[分享] 分享一份“D3DXVec3Project”矩阵转换的E源码

[复制链接]
结帖率:0% (0/1)
发表于 2024-6-19 22:11:55 | 显示全部楼层 |阅读模式   广西壮族自治区百色市
分享例程
界面截图:
备注说明: 关于世界坐标转屏幕坐标的D3DXVec3Project”转换纯源码
C#源码:参考一:

```csharp
using System.Numerics;


public struct Vector3
{
    public float X, Y, Z;


    public Vector3(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }


    public static Vector3 operator *(Vector3 vector, Matrix4x4 matrix)
    {
        return new Vector3(
            (vector.X * matrix.M11 + vector.Y * matrix.M21 + vector.Z * matrix.M31 + 1 * matrix.M41),
            (vector.X * matrix.M12 + vector.Y * matrix.M22 + vector.Z * matrix.M32 + 1 * matrix.M42),
            (vector.X * matrix.M13 + vector.Y * matrix.M23 + vector.Z * matrix.M33 + 1 * matrix.M43)
        );
    }
}


public struct Matrix4x4
{
    public float M11, M12, M13, M14;
    public float M21, M22, M23, M24;
    public float M31, M32, M33, M34;
    public float M41, M42, M43, M44;
   
    // Constructor and other methods would be defined here...
}


public class MatrixOperations
{
    public static Matrix4x4 Multiply(Matrix4x4 left, Matrix4x4 right)
    {
        return new Matrix4x4()
        {
            M11 = left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31 + left.M14 * right.M41,
            M12 = left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32 + left.M14 * right.M42,
            M13 = left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33 + left.M14 * right.M43,
            M14 = left.M11 * right.M14 + left.M12 * right.M24 + left.M13 * right.M34 + left.M14 * right.M44,


            M21 = left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31 + left.M24 * right.M41,
            M22 = left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32 + left.M24 * right.M42,
            M23 = left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33 + left.M24 * right.M43,
            M24 = left.M21 * right.M14 + left.M22 * right.M24 + left.M23 * right.M34 + left.M24 * right.M44,


            M31 = left.M31 * right.M11 + left.M32 * right.M21 + left.M33 * right.M31 + left.M34 * right.M41,
            M32 = left.M31 * right.M12 + left.M32 * right.M22 + left.M33 * right.M32 + left.M34 * right.M42,
            M33 = left.M31 * right.M13 + left.M32 * right.M23 + left.M33 * right.M33 + left.M34 * right.M43,
            M34 = left.M31 * right.M14 + left.M32 * right.M24 + left.M33 * right.M34 + left.M34 * right.M44,


            M41 = left.M41 * right.M11 + left.M42 * right.M21 + left.M43 * right.M31 + left.M44 * right.M41,
            M42 = left.M41 * right.M12 + left.M42 * right.M22 + left.M43 * right.M32 + left.M44 * right.M42,
            M43 = left.M41 * right.M13 + left.M42 * right.M23 + left.M43 * right.M33 + left.M44 * right.M43,
            M44 = left.M41 * right.M14 + left.M42 * right.M24 + left.M43 * right.M34 + left.M44 * right.M44,
        };
    }
}




    public static Vector3 ProjectPoint(Vector3 point, Matrix world, Matrix view, Matrix projection, int viewportWidth, int viewportHeight)
    {
        Matrix combinedMatrix = world * view * projection;
        Vector3 transformedPoint = point * combinedMatrix;

        // 透视除法
        float oneOverW = 1.0f / transformedPoint.Z;
        Vector3 screenPoint = new Vector3(
            transformedPoint.X * oneOverW,
            transformedPoint.Y * oneOverW,
            transformedPoint.Z * oneOverW
        );

        // 转换到视口坐标
        screenPoint.X = screenPoint.X * (viewportWidth / 2) + viewportWidth / 2;
        screenPoint.Y = -screenPoint.Y * (viewportHeight / 2) + viewportHeight / 2; // 注意Y轴的翻转

        return screenPoint;
    }
}

这里的`Vector3`和`Matrix4x4`结构体以及相关的运算符重载和方法都是简化的版本

E没有相对应的库只能构造一个`Vector3`和`Matrix4x4`类型两份C源码+一份E纯源码都在文件里哦
0.jpg
矩阵相乘  回帖查看密码送精币哦→qun398897142[/hide]
2.jpg



纯源码文件下载→[hide]源码密码: 易语言D3DXVec3Project运算纯源码.rar (21.47 KB, 下载次数: 8)
0.jpg
结帖率:0% (0/1)

签到天数: 17 天

 楼主| 发表于 2024-7-4 00:34:49 | 显示全部楼层   广西壮族自治区百色市

qun398897142
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 7 天

发表于 2024-7-3 10:35:27 | 显示全部楼层   江西省南昌市
密码多少哦
回复 支持 反对

使用道具 举报

结帖率:0% (0/3)

签到天数: 1 天

发表于 2024-6-20 05:32:03 | 显示全部楼层   安徽省马鞍山市
这玩意 。。随便下载个源码,里面就有,,,,
回复 支持 反对

使用道具 举报

结帖率:70% (35/50)

签到天数: 31 天

发表于 2024-6-20 05:01:09 | 显示全部楼层   广西壮族自治区南宁市
直接看懵了……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表