Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标
最近遇到了一个困扰我许久的难题,现将解决方案分享出来
由于我们的项目侧重点在前端绘图,导致了前后端工作量不协调,我后端接口很快就能写完,而前端一个图要画好久,领导见状将前端的任务分到后端一部分用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坐标的更多相关文章
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- 【3D计算机图形学】变换矩阵、欧拉角、四元数
[3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算. 一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转 ...
- 《计算机图形学3D》
<计算机图形学方法原理应用> Opengl语言 光线跟踪 贝塞尔曲线 射线追踪 色彩理论 纹理映射 逆向运动 MPI 仿射 绘制流水线 透视变换 bre ...
- 计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都能够看看.
本书參照<<图形学扫盲>> 整理的,原文内容引子: http://www.cppblog.com/lai3d/archive/2008/12/30/70796.html 前言: ...
- SIGGRAPH 2017:深度学习与计算机图形学的碰撞
每年由美国计算机协会(Association of Computing Machinery,简称ACM)计算机图形专业组举办的年会SIGGRAPH,是全球最负盛名的图形学和交互技术盛会.今年已经是这场 ...
- 关于opengl中的矩阵平移,矩阵旋转,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12166896.html 为什么引入齐次坐标的变换矩阵可以表示平移呢? - Yu Mao的回答 ...
- 计算机图形学 - 图形变换(opengl版)
作业题目: 图形变换:实现一个图形绕任意直线旋转的程序. 要求:把一个三维图形绕任意一条直线旋转,需要有初始图形,和旋转后的图形,最好也可以实时控制旋转. 最少要做出绕z轴旋转. 原理:http:// ...
- Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]
最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...
- [图形学] 计算机图形学 with OpenGL开篇
<计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...
- 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误
计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误: 书上本来要写的是以x为阶越步长的方法,但是他写的是用一部分y为阶越步长的方法(其实也写的不对),最后以x为阶越步长的 ...
随机推荐
- [人生感悟]做人、做事的"人生十悟"【转载】
做人.做事.做官,是不少人需要经常面对和正确把握的大问题,处理好了,则健康成长,反之则裹足不前,甚至掉入人生的一个个"陷阱",这其中有规律可循,总结"十悟"可思 ...
- tkinter的标签和按钮以及输入和文本
一.标签和文本 import tkinter as tk #1.定义tk的实例对象,也就是窗口对象 window = tk.TK() #2.设置窗口大小无法缩小和放大 window.resiable( ...
- day107:MoFang:Python操作MongoDB数据库:PyMongo
目录 PyMongo 1.PyMongo安装 2.数据库连接 3.数据库管理 4.集合管理 5.文档管理 PyMongo 1.PyMongo安装 pip install pymongo 2.数据库连接 ...
- [Go] 递归获取目录下的文件
操作示例: ./scan /Document/dir 代码: // 定义递归文件树结构体 type treeList struct { Path string `json:"path&quo ...
- 基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
2023年目前要说最热的点,肯定是ChatGPT了. ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装. 现在是移动互联网时代,基于手机APP的需求还是很大的. 所以,今天 ...
- k8s介绍与常用命令
kubernetes基础与常用命令 原文地址 https://blog.csdn.net/footless_bird/article/details/125798691 官方文档 https://ku ...
- 解决VM虚拟机中IP或域名不能ping通
c4548abb-da65-4f7d-827f-e95dca25a13d 问题 无法ping通域名, 检查事项 确定在同一个子网,能访问DNS服务器. DNS服务器正确设置了正反向解析,且DNS服务器 ...
- C#实现右下角托盘程序,默认不显示窗体,关闭窗体时隐藏而不退出
Windows右下角托盘程序是Windows系统的一大特色.在某些场景非常适用. 因业务需要实现一个后台程序,需要开机自动启动,默认不显示窗体,点击系统右下角托盘图标时显示窗体,关闭窗体时隐藏而不退出 ...
- selenium文件上传和弹框处理
文件上传 input 标签可以直接使用send_keys(文件地址)上传文件 用法: el = driver.find_element_by_id('上传按钮id') el.send_keys(&qu ...
- Vue拖拽排序
转载至https://www.crazyming.com/note/757/ 使用拖拽功能来实现排序. 需要先学习w3cschool 关于拖拽的教程:http://www.w3school.com.c ...