最近遇到了一个困扰我许久的难题,现将解决方案分享出来

由于我们的项目侧重点在前端绘图,导致了前后端工作量不协调,我后端接口很快就能写完,而前端一个图要画好久,领导见状将前端的任务分到后端一部分用Java代码来实现,然后给前端提供接口

而我接到的任务就是将Echarts中绘制三维图形的点旋转后投影为2D坐标,当我一个大专生在了解需求,并知道这涉及到线性代数和计算机图形学后,我的想法是这样的:

我想了很多种方法,一开始在网上搜Java相关资料,但是网上好像没有人处理过这种情况,找到的帖子都是做Java图形化的,他们所谓的坐标旋转是直接用眼球看到的界面效果,跟我想要的计算完全不同

而后我又拜托ChatGPT帮我写了几版,不得不说的确帮我写出来了,而且自己测试效果还可以,但是前端调接口后点数太多了,旋转后的坐标直接乱了,最终我在网上游荡了很久找到了解决方案,目前效果还算不错

功能实现

首先在pom.xml中添加joml的Maven坐标,该库是一个轻量级数学库,专门用于处理3D图形的数学计算

<!-- 计算机图形学计算库 -->
<dependency>
<groupId>org.joml</groupId>
<artifactId>joml</artifactId>
<version>1.10.5</version>
</dependency>

然后创建个主类编写测试代码,方法很简单直接调用就好啦

import org.joml.Matrix3d;
import org.joml.Vector3d; public class Application { public static void main(String[] args) {
// 构建一个X轴旋转90°的旋转对象
Matrix3d matrix = new Matrix3d().rotateX(Math.toRadians(90));
// 构建一个3D坐标点
Vector3d point = new Vector3d(10, 10, 10);
// 执行旋转
Vector3d transform = matrix.transform(point);
// 打印旋转后的角度
System.out.println(transform.x);
System.out.println(transform.y);
System.out.println(transform.z);
} }

很悲哀,这么简单的几行代码困扰了我两三天才把功能做出来,见识少就是不行啊

封装为Springboot接口

这里我就不写封装接口的过程了,我会把代码地址放到文章结尾,有需要请自行获取,这里展示一下接口的使用和效果

首先打开Echarts的官网,分别打开三维折线图和二维折线图,用我给的这组测试数据画出一个三维折线图,或者自己有测试数据也可以

var data = [[0, 0, 0], [8, 8, 6], [18, 12, 4], [13, 21, 7]];

然后调用写好的rotateProj接口,将坐标和轴旋转角度传入,查看效果

不进行旋转,直接看正面

Z轴旋转90°

X轴旋转90°

Z轴旋转45°

有一点比较可惜,经过测试改代码仅支持单轴旋转,如果同时旋转两个轴以上效果就会有问题,不过单轴旋转已经可以满足我项目的需求,就不再花费时间研究这个东西了,有兴趣可自行钻研joml这个框架,如果您解决了多轴旋转的问题还请回来留个言,可以帮助到更多人

代码地址:https://gitee.com/zhang_hanzhe/example-java/tree/master/springboot-proj-coord

Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标的更多相关文章

  1. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  2. 【3D计算机图形学】变换矩阵、欧拉角、四元数

    [3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算.   一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转 ...

  3. 《计算机图形学3D》

    <计算机图形学方法原理应用> Opengl语言    光线跟踪   贝塞尔曲线  射线追踪   色彩理论  纹理映射 逆向运动   MPI  仿射   绘制流水线   透视变换   bre ...

  4. 计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都能够看看.

    本书參照<<图形学扫盲>> 整理的,原文内容引子: http://www.cppblog.com/lai3d/archive/2008/12/30/70796.html 前言: ...

  5. SIGGRAPH 2017:深度学习与计算机图形学的碰撞

    每年由美国计算机协会(Association of Computing Machinery,简称ACM)计算机图形专业组举办的年会SIGGRAPH,是全球最负盛名的图形学和交互技术盛会.今年已经是这场 ...

  6. 关于opengl中的矩阵平移,矩阵旋转,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12166896.html 为什么引入齐次坐标的变换矩阵可以表示平移呢? - Yu Mao的回答 ...

  7. 计算机图形学 - 图形变换(opengl版)

    作业题目: 图形变换:实现一个图形绕任意直线旋转的程序. 要求:把一个三维图形绕任意一条直线旋转,需要有初始图形,和旋转后的图形,最好也可以实时控制旋转. 最少要做出绕z轴旋转. 原理:http:// ...

  8. Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]

    最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...

  9. [图形学] 计算机图形学 with OpenGL开篇

    <计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...

  10. 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误

    计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误: 书上本来要写的是以x为阶越步长的方法,但是他写的是用一部分y为阶越步长的方法(其实也写的不对),最后以x为阶越步长的 ...

随机推荐

  1. Flask+Gunicorn+Nginx配置多个app

    请自行安装好nginx.gunicorn和flask的运行环境,这里不再赘述 Nginx配置 修改nginx的配置 vi /etc/nginx/sites-available/default //de ...

  2. 【AIGC未来的发展方向】面向人工智能的第一步,一文告诉你人工智能是什么以及未来的方向分析

    人工智能的概念 当人们提到"人工智能(AI)"时,很多人会想到机器人和未来世界的科幻场景,但AI的应用远远不止于此.现在,AI已经广泛应用于各种行业和生活领域,为我们带来了无限可能 ...

  3. elasticsearch 官方优化建议

    1.一般建议   a.不要返回过大的结果集.这个建议对一般数据库都是适用的,如果要获取大量结果,可以使用search_after api,或者scroll (新版本中已经不推荐).   b.避免大的文 ...

  4. Atcoder Regular Contest 093 C - Bichrome Spanning Tree

    给定一张图,对图上边黑白染色,使得同时选择了两种颜色边的最小生成树边权和为X,求染色方案数. 先求出图的\(mst\)大小,然后分三类讨论: 1.\(X<mst\) 无解 2.\(X==mst\ ...

  5. day64:Linux:nginx模块之限制连接&状态监控&Location/用nginx+php跑项目/扩展应用节点

    目录 1.nginx模块:限制连接 limit_conn 2.nginx模块:状态监控 stub_status 3.nginx模块:Location 4.用nginx+php跑wordpress项目 ...

  6. flume基本安装与使用

    解压flume包 到/usr/local/src/目录下 [root@hadoopha01 pack]# tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /usr ...

  7. Azure Devops上模版化K8s部署

    在2022年我们终于完成了主要业务系统上K8s的计划,在这里总结下我们上K8s时候的模版工程. 前提条件 本文不讨论K8s是什么,什么是容器化,为什么需要容器化,什么是微服务等这些基础内容,这些到处说 ...

  8. 深入理解 slab cache 内存分配全链路实现

    本文源码部分基于内核 5.4 版本讨论 在经过上篇文章 <从内核源码看 slab 内存池的创建初始化流程> 的介绍之后,我们最终得到下面这幅 slab cache 的完整架构图: 本文笔者 ...

  9. cryptohack wp day(4)

    接上题 第五题(Modular Inverting) 在模运算中,如果我们要解决形如a * x ≡ b mod m的方程,其中a,b,m是已知整数,x是未知整数,我们可以使用扩展欧几里得算法来找到x的 ...

  10. 2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。

    2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1. 福大大 答案2021-03-19: 按行遍历二维数组,构造直方图. 单调栈,大 ...