首页 > 编程语言 >Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标

Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标

时间:2023-07-01 18:02:13浏览次数:52  
标签:正交投影 Java transform 图形学 接口 旋转 joml 坐标

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

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

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

image

我想了很多种方法,一开始在网上搜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的官网,分别打开三维折线图和二维折线图,用我给的这组测试数据画出一个三维折线图,或者自己有测试数据也可以

image

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

image

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

不进行旋转,直接看正面

image

image

Z轴旋转90°

image

image

X轴旋转90°

image

image

Z轴旋转45°

image

image

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

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

标签:正交投影,Java,transform,图形学,接口,旋转,joml,坐标
From: https://www.cnblogs.com/hanzhe/p/17499019.html

相关文章

  • AnyCAD应用——修改指定点,线,面的坐标实现物体移动
    课题需求:三维模型位置随实物位置改变而动态改变的功能,通过顶点位置坐标的改变,修改模型在显示中的位置。功能验证:目前,可通过选中顶点手动输入坐标的方式,模拟验证此功能。首先,点击“文件”工具栏,选择导入实体,导入一个step文件,这是一种常用的三维实体模型格式。 voidOnOpen......
  • Qt界面坐标
    x:左上角距屏幕左上角的水平距离y:左上角距屏幕左上角的竖直距离geometry几何属性:整个窗体的属性用frameGeometry(),客户区的属性用geometry()。#include"QtWidgets0628.h"#include<QtWidgets/QApplication>#include<qdebug.h>intmain(intargc,char*argv[]){QAp......
  • 如何获取页面上某个元素的坐标
    打开浏览器的F12控制台,在console内输入下面代码functiongetPosition(node){//获取元素相对于其父元素的left值varleftvarleft=node.offsetLeft;vartop=node.offsetTop;//取得元素的offsetParentcurrent=node.offsetParent;//一直循环直到根元素while(current!=nu......
  • 【RS】基于ENVI给图片/影像定义坐标系
    ​        作为遥感工作者,有时会需要对图片或者影像进行镶嵌拼接的操作,但ENVI里的镶嵌需要图片/影像本身具有投影坐标系。那么问题就来了,如果我的图片没有坐标系,或者只知道图片中心点的经纬度坐标(GPS),那我们该如何进行镶嵌拼接操作呢?我们可以先给图片赋予一张投影坐标系,......
  • zemax光学设计-案例5-一个fTheta透镜与坐标断点
    案例5–f-theta透镜与坐标断点1、波长632nm2、ENPD=50mm3、F#=34、扫描角度10deg5、双胶合BK7+F26、视场0°即可目标:学习坐标断点(旋转反射镜改变光束位置)多重结构组态中,附加数据#:3(选择第三个面的第三个参数作为parameter)优化:由于只是学习目标断......
  • 案例5-一个fTheta透镜与坐标断点
    案例5–f-theta透镜与坐标断点1、波长632nm2、ENPD=50mm3、F#=34、扫描角度10deg5、双胶合BK7+F26、视场0°即可目标:学习坐标断点(旋转反射镜改变光束位置)多重结构组态中,附加数据#:3(选择第三个面的第三个参数作为parameter)优化:由于只是学习目标断点且双胶合透镜......
  • 线性代数-二次型-坐标变换笔记
    原来的二次型\(f\left(x_{1},x_{2},x_{3}\right)\)经过坐标变换变成了\(g\left(y_{1},y_{2},y_{3}\right)\)这个新的二次型$x^{\mathrm{T}}Ax$经过坐标变换变成$y^{\mathrm{T}}By$原来的二次型矩阵\(A\)变成了\(B\)(也是实对称矩阵)\(A\)和\(B\)之间的之间的关......
  • MapView Marker shadow坐标问题
    Drawabledrawable=app1.getResources().getDrawable(R.drawable.test);drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());OverlayItemoverlayitem2=newOverlayItem(mark,"Test","t");overlayitem2......
  • GD指纹算法,指纹识别算法源码出售 指纹识别算法极度优化极坐标三角运算算法,源码级出售,
    GD指纹算法,指纹识别算法源码出售指纹识别算法极度优化极坐标三角运算算法,源码级出售,拿到即可移植应用。另有符合国际ISO标准的指纹识别算法,实现各种算法的指纹模板通比和加密传输ID:8162999597738557021......
  • 【RS】使用ENVI对遥感影像进行坐标系转换,定义投影
    ​         ENVI是一个完整的遥感图像处理平台,广泛应用于科研、环境保护、气象、农业、林业、地球科学、遥感工程、水利、海洋等领域。目前ENVI已成为遥感影像处理的必备软件,包含辐射定标、大气校正、镶嵌裁剪、分类识别、阈值分割等多种功能。ENVI针对绝大部分的卫星......