【JAVA】OPENGL绕XYZ轴旋转立体图效果

news2024/11/29 9:00:36

JAVA-OPENGL绕XYZ轴旋转立体图效果_哔哩哔哩_bilibiliJAVA-OPENGL绕XYZ轴旋转立体图效果开始显示的是绕X轴、Y轴、Z轴旋转,后边是同时绕两个轴旋转,头有点晕,反应不过来了。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 缘起性空aa, 作者简介 ,相关视频:iPhone空间视频转变为3d红蓝立体视频,手机VR身临其境玩《巨击大乱斗》体验奥特曼飞出屏幕!!【超级视觉】3D VR 立体出屏 震撼体验,地狱级“3D立体拼图”挑战!3D牛肉VS猪骨架,一个比一个更烧脑?,纯干货|手把手教你打造立体四区阳台,平面设计CDR教程-立体包装盒效果,认知水平越高,看不惯的东西越少!钩针编织创意立体手工花,【钩针编织】-玫瑰花/山茶花的立体花一体成型钩织教程,手机VR身临其境玩《刀魂6》时间暂停感受出屏瞬间!【超级视觉】3D VR 立体出屏 震撼体验,这是一种很新颖的东西,自动化立体仓库建模仿真与优化icon-default.png?t=N7T8https://www.bilibili.com/video/BV1je411q7n5/?vd_source=0578c14da2b84f0964bbee439d4fd921 

import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;

import java.nio.*;
import java.util.logging.Logger;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL32.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

public class HelloWorld {

    // The window handle
    private long window;
    public static Logger logger = MyLogger.logger;
    private float angle;

    public void run() {
        logger.info("Hello LWJGL " + Version.getVersion() + "!");

        init();
        loop();
        // Free the window callbacks and destroy the window
        glfwFreeCallbacks(window);
        glfwDestroyWindow(window);

        // Terminate GLFW and free the error callback
        glfwTerminate();
        glfwSetErrorCallback(null).free();
    }

    private void init() {
        logger.info("init");
        // Setup an error callback. The default implementation
        // will print the error message in System.err.
        GLFWErrorCallback.createPrint(System.err).set();

        angle = 5;

        // Initialize GLFW. Most GLFW functions will not work before doing this.
        if ( !glfwInit() )
            throw new IllegalStateException("Unable to initialize GLFW");

        // Configure GLFW
        glfwDefaultWindowHints(); // optional, the current window hints are already the default
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable

        // Create the window
        window = glfwCreateWindow(600, 600, "Hello World!", NULL, NULL);
        if ( window == NULL )
            throw new RuntimeException("Failed to create the GLFW window");

        // Setup a key callback. It will be called every time a key is pressed, repeated or released.
        glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
            if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
                glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
        });

        // Get the thread stack and push a new frame
        try ( MemoryStack stack = stackPush() ) {
            IntBuffer pWidth = stack.mallocInt(1); // int*
            IntBuffer pHeight = stack.mallocInt(1); // int*

            // Get the window size passed to glfwCreateWindow
            glfwGetWindowSize(window, pWidth, pHeight);

            // Get the resolution of the primary monitor
            GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

            // Center the window
            glfwSetWindowPos(
                    window,
                    (vidmode.width() - pWidth.get(0)) / 2,
                    (vidmode.height() - pHeight.get(0)) / 2
            );
        } // the stack frame is popped automatically

        // Make the OpenGL context current
        glfwMakeContextCurrent(window);
        // Enable v-sync
        glfwSwapInterval(1);

        // Make the window visible
        glfwShowWindow(window);
    }

    /**
     * 绘制三角形
     */
    public void DrawTriangles()
    {
        glTranslatef(0.1f, -0.2f, -0.20f); //平移矩阵
        glRotatef(angle, 1.0f, 0.0f, 1.0f); //绕X,Y, Z轴直线旋转XX度
        glLineWidth(2);
        glColor3f(1f, 0f, 0f);
        glBegin(GL_TRIANGLES);

        //前侧面
        glColor3f(0.5f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.5f, 0.0f);      //上顶点
        glVertex3f(-0.5f, -0.5f, 0.5f);    //左下顶点
        glVertex3f(0.5f, -0.5f, 0.5f);     //右下顶点

        //右侧面
        glColor3f(0.0f, 0.5f, 0.0f);
        glVertex3f(0.0f, 0.5f, 0.0f);      //上顶点
        glVertex3f(0.5f, -0.5f, 0.5f);     //左下顶点
        glVertex3f(0.5f, -0.5f, -0.5f);    //右下顶点

        //后侧面
        glColor3f(0.0f, 0.0f, 0.5f);
        glVertex3f(0.0f, 0.5f, 0.0f);      //上顶点
        glVertex3f(0.5f, -0.5f, -0.5f);    //左下顶点
        glVertex3f(-0.5f, -0.5f, -0.5f);   //右下顶点

        //左侧面
        glColor3f(1f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.5f, 0.0f);      //上顶点
        glVertex3f(-0.5f, -0.5f, -0.5f);   //左下顶点
        glVertex3f(-0.5f, -0.5f, 0.5f);    //右下顶点
        angle+=5;
        glEnd();
    }

    public void DrawLines()
    {
        glBegin(GL_LINES);
        glVertex2i(0, 0);
        glVertex2i(0, 1);
        glEnd();
    }

    public void DrawQuads()
    {
        glBegin(GL_QUADS);

        //顶面
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, -1.0f);     //右上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左上顶点
        glVertex3f(-1.0f, 1.0f, 1.0f);     //左下顶点
        glVertex3f(1.0f, 1.0f, 1.0f);      //右下顶点

        //底面
        glColor3f(1.0f, 0.5f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);     //右上顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);    //左上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左下顶点
        glVertex3f(1.0f, -1.0f, -1.0f);    //右下顶点

        //前面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, 1.0f);      //右上顶点
        glVertex3f(-1.0f, 1.0f, 1.0f);     //左上顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);    //左下顶点
        glVertex3f(1.0f, -1.0f, 1.0f);     //右下顶点

        //后面
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);    //右上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左下顶点
        glVertex3f(1.0f, 1.0f, -1.0f);     //右下顶点

        //左侧面
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);     //右上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左下顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);     //右下顶点

        //右侧面
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f(1.0f, 1.0f, -1.0f);     //右上顶点
        glVertex3f(1.0f, 1.0f, 1.0f);      //左上顶点
        glVertex3f(1.0f, -1.0f, 1.0f);     //左下顶点
        glVertex3f(1.0f, -1.0f, -1.0f);    //右下顶点

        glEnd();
    }
    private void loop() {
        logger.info("loop");

        // This line is critical for LWJGL's interoperation with GLFW's
        // OpenGL context, or any context that is managed externally.
        // LWJGL detects the context that is current in the current thread,
        // creates the GLCapabilities instance and makes the OpenGL
        GL.createCapabilities();
        //DrawQuads();
        //-----------------------------------------
        //glLoadIdentity();   //重置当前的模型观察矩阵

        //————————————————
        //版权声明:本文为CSDN博主「贝勒里恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        //原文链接:https://blog.csdn.net/Mr_robot_strange/article/details/123682686
        while (true)
        {
            glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存

            //-----------------------------------------
            glLoadIdentity();   //重置当前的模型观察矩阵

            //DrawLines();
            DrawTriangles();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }

    }

    public static void main(String[] args) {
        logger.info("main");
        new HelloWorld().run();
    }

}
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

/**
 * 可以自已定义日志打印格式,这样看起来比较方便些
 *
 */
class MyFormatter extends Formatter
{
    @Override
    public String format(LogRecord arg0)
    {
        //创建StringBuilder对象来存放后续需要打印的日志内容
        StringBuilder builder = new StringBuilder();

        //获取时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
        Date now = new Date();
        String dateStr = simpleDateFormat.format(now);

        builder.append("[");
        builder.append(dateStr);
        builder.append(" ");

        //拼接日志级别
        builder.append(arg0.getLevel()).append(" ");

        builder.append(arg0.getSourceClassName()).append(" ");

        //拼接方法名
        builder.append(arg0.getSourceMethodName()).append(" ");

        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        String line = stackTrace[8].toString();
        String lineNumber = line.substring(line.indexOf(":") + 1, line.length() - 1);

        //拼接方法名
        builder.append(lineNumber).append("] ");

        //拼接日志内容
        builder.append(arg0.getMessage());

        //日志换行
        builder.append("\r\n");

        return builder.toString();
    }
}

public class MyLogger {
    static Logger logger;

    static  {
        logger = Logger.getLogger(MyLogger.class.getName());
        logger.setUseParentHandlers(false);
        //如果需要将日志文件写到文件系统中,需要创建一个FileHandler对象
        Handler consoleHandler = new ConsoleHandler();

        //创建日志格式文件:本次采用自定义的Formatter
        consoleHandler.setFormatter(new MyFormatter());

        //将FileHandler对象添加到Logger对象中
        logger.addHandler(consoleHandler);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void main(String[] args) {
        MyLogger.logger.info("1");
        Logger logger = MyLogger.logger;
        logger.info("2");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1341153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件? 在更新DB的时候不同步更新到redis,es等数据库中,时间太久,而且可能会存在同步失败的问题,因此引入canal去拉取DB的数据,再去更新到redis,es等数据库中&…

【Harmony OS - 应用数据持久化】

概述 应用数据持久化就是应用将内存中的数据通过文件或者数据库的方式保存在设备本机上。HarmonyOS标准系统支持一下三种f方式进行持久化处理:包括用户首选项、键值型数据库、关系型数据库。 用户首选项 用户首选项(Preferences) 是通过将数据(Key-Value键值)保存…

【C++篇】讲解Vector容器的操作方法

文章目录 🍔vector容器概念🌹操作方法⭐赋值操作⭐容量和大小⭐插入和删除⭐数据存取 🍔vector容器概念 vector 是 C 标准库中的一个容器,它提供了一种动态数组的实现。vector 容器可以存储任意类型的元素,并且可以根…

【办公技巧】为什么有的pdf不能编辑

pdf文件大家应该都经常接触,但是不知道大家会遇到这种情况:有些PDF文件打开之后无法编辑?是什么原因呢?今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下,PDF文件中的内容是否是图片,如果确认…

【中小型企业网络实战案例 四】配置OSPF动态路由协议

【中小型企业网络实战案例 三】配置DHCP动态分配地址-CSDN博客 【中小型企业网络实战案例 二】配置网络互连互通-CSDN博客 【中小型企业网络实战案例 一】规划、需求和基本配置_大小企业网络配置实例-CSDN博客 配置OSPF 由于内网互联使用的是静态路由,在链路出…

软件测试/测试开发丨Git常用命令学习笔记

基于 Git 的远程仓库 远程仓库地址备注GitHubgithub.com/世界上最主流的远程开源仓库。Giteegitee.com/国内目前比较主流的开源仓库,也可以私有化部署。(推荐)GitLabgitlab.com/私有化部署,企业使用较多。 Git 远程仓库的应用场…

腾讯云服务器怎么购买?购买流程

腾讯云轻量应用服务器购买指南,有两个入口,一个是在特价活动上购买,一个是在轻量应用服务器官方页面购买,特价活动上购买价格更便宜,轻量2核2G3M带宽服务器62元一年起,阿腾云atengyun.com分享腾讯云轻量应用…

Codeforces Pinely Round 3 (Div. 1 + Div. 2) A~F

A.Distinct Buttons(思维) 题意: 你在开始时站在点 ( 0 , 0 ) (0,0) (0,0),同时,手上有一个遥控器,上面有四个按钮: U:移动到 ( x , y 1 ) (x, y 1) (x,y1)的位置 R:移动到 ( x 1 , y ) (x 1, y) (x1,y)的位置 …

数据集介绍【02】CIFAR10

CIFAR10数据集共有60000个样本,每个样本都是一张32*32像素的RGB图像(彩色图像),每个RGB图像又必定分为3个通道(R通道、G通道、B通道)。这60000个样本被分成了50000个训练样本和10000个测试样本。 CIFAR10数…

2024年【茶艺师(初级)】考试试卷及茶艺师(初级)考试总结

题库来源:安全生产模拟考试一点通公众号小程序 茶艺师(初级)考试试卷参考答案及茶艺师(初级)考试试题解析是安全生产模拟考试一点通题库老师及茶艺师(初级)操作证已考过的学员汇总,…

日常中msvcp120.dll丢失五种解决方法

在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是“msvcp120.dll丢失”。那么,msvcp120.dll到底是什么?它的作用又是什么呢?为什么会出现丢失的情况呢?本文将为您详细介绍msvcp120.dll的相…

4.Python数据序列

Python数据序列 一、作业回顾 1、面试题 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 白话文:有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3,用7去除剩2个,问这个数是多少?1 ~ 100以内的整数 while循环: # 初始化计数器 i = …

为什么企业需要客户crm系统?

客户CRM提供数据储存,数据调配,数据分析。让传统的人工操作,让系统去完成。企业只需要提供原始数据就行了。举几个栗子: 1、客户资料的集中管理:可以集中存储和管理客户信息,包括联系方式、工商信息&#…

用户规模破亿!基于文心一言的创新应用已超4000个

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

nginx源码分析-1

使用gdb查看函数上下文: gdb attach nginx的work线程 监听端口状态时: 断点打在ngx_http_process_request 并通过浏览器触发请求时:

【yolov5驾驶员和摩托车佩戴头盔的检测】

yolov5驾驶员和摩托车佩戴头盔的检测 数据集和模型yolov5驾驶员和摩托车佩戴头盔的检测yolov5驾驶员和摩托车佩戴头盔的检测可视化结果 数据集和模型 数据和模型下载: yolov5摩托车佩戴头盔和驾驶员检测模型 yolov5-6.0-helmat-mortor-1225.zipyolov3摩托车佩戴头…

计算机操作系统(OS)——P1操作系统概述

1、操作系统的概念(定义) 1.1、什么是操作系统 __操作系统(Operating System,OS):__是指控制和管理整个计算机系统的__硬件和软件__资源,并合理的组织调度计算机的工作和资源的分配;以__提供给用户和其它…

im6ull学习总结(三)文字显示

文字显示 字符编码方式 编码与字体 一个字符以不同编码形式会保存为不同的二进制数。 ASCII American Standard Code for Information Interchange”的缩写,美国信息交换标准代码。 一个字节的 7 位就可以表示 128 个数值,在 ASCII 码中最高位永远是…

实习知识整理13:在购物车界面点击提交订单进入订单信息界面

在这块主要就是对前端传到后端的数据的处理,然后由后端再返还到新的前端界面 首先点击下单按钮后, 提交购物车中所选中的信息 因为前端是将name定义为 cartList[0].cartId ,cartList[1].cartId 形式的 所以后端需要重新定义一个类来进行封装…

开源预约挂号平台 - 从0到上线

文章目录 开源预约挂号平台 - 从0到上线演示地址源码地址可以学到的技术前端技术后端技术部署上线开发工具其他技术业务功能 项目讲解前端创建项目 - 安装PNPM - 使用VSCODE - 安装插件首页顶部与底部 - 封装组建 - 使用scss左右布局中间内容部分路由 - vue-routerBANNER- 走马…