【libGDX】使用ShapeRenderer绘制几何图形

1 ShapeRenderer 简介 

        ShapeRenderer 是 libGDX 中用于绘制基本形状的工具之一。它可以绘制点、线、矩形、多边形、圆形、椭圆形、扇形、立方体、圆锥体等几何图形。这对于在游戏或图形应用程序中绘制简单的形状是很有用的。

        ShapeRenderer 的主要方法如下:

        1)开始和结束绘制

// 开始绘制, ShapeType取值有: Point(点)、Line(线)、Filled(内部填充)
// 例: shapeRenderer.begin(ShapeRenderer.ShapeType.Line)
public void begin(ShapeType type)
public void begin() // ShapeType默认取值Line
// 结束绘制
public void end()

        说明:绘制相关逻辑需要放在 begin 和 end 之间。 

        2) 设置颜色和形状类型

// 设置图形颜色
public void setColor(float r, float g, float b, float a)
public void setColor(Color color)
// 设置ShapeType, 取值有: Point(点)、Line(线)、Filled(内部填充)
public void set (ShapeType type)

        3)模型变换矩阵

// transformMatrix矩阵
public void setTransformMatrix(Matrix4 matrix)
public void identity() // 重置transformMatrix
public void translate(float x, float y, float z) // 平移
public void rotate(float axisX, float axisY, float axisZ, float degrees) // 旋转
public void scale(float scaleX, float scaleY, float scaleZ) // 缩放

        4)投影变换矩阵

// projectionMatrix矩阵, 通常设置为camera.combined
public void setProjectionMatrix(Matrix4 matrix)
public Matrix4 getProjectionMatrix()

        5)绘制图形

// 绘制一个点
public void point(float x, float y, float z)// 绘制一条线段
public final void line(float x, float y, float z, float x2, float y2, float z2)
public final void line(Vector3 v0, Vector3 v1)
public final void line(float x, float y, float x2, float y2)
public final void line(Vector2 v0, Vector2 v1)
public final void line(float x, float y, float x2, float y2, Color c1, Color c2)
public void line(float x, float y, float z, float x2, float y2, float z2, Color c1, Color c2)// 绘制三角形
public void triangle(float x1, float y1, float x2, float y2, float x3, float y3)
public void triangle(float x1, float y1, float x2, float y2, float x3, float y3, Color col1, Color col2, Color col3)// 绘制矩形
public void rect(float x, float y, float width, float height)
public void rect(float x, float y, float width, float height, Color col1, Color col2, Color col3, Color col4)
public void rect(float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float degrees)// 绘制矩形线段
public void rectLine(float x1, float y1, float x2, float y2, float width)
public void rectLine(float x1, float y1, float x2, float y2, float width, Color c1, Color c2)
public void rectLine(Vector2 p1, Vector2 p2, float width)// 绘制立方体
public void box(float x, float y, float z, float width, float height, float depth)// 在指定位置绘制一个X形交叉线
public void x(float x, float y, float size)
public void x(Vector2 p, float size)// 绘制扇形
public void arc(float x, float y, float radius, float start, float degrees)
public void arc(float x, float y, float radius, float start, float degrees, int segments)// 绘制圆形
public void circle(float x, float y, float radius)
public void circle(float x, float y, float radius, int segments)// 绘制椭圆形, x、y指椭圆左下角的位置坐标
public void ellipse(float x, float y, float width, float height)
public void ellipse(float x, float y, float width, float height, int segments)
public void ellipse(float x, float y, float width, float height, float rotation)
public void ellipse(float x, float y, float width, float height, float rotation, int segments)// 绘制圆锥
public void cone(float x, float y, float z, float radius, float height)
public void cone(float x, float y, float z, float radius, float height, int segments)// 绘制多边形(首尾相连, ShapeType只能取Line)
public void polygon(float[] vertices, int offset, int count)
public void polygon(float[] vertices)// 绘制多边形(首尾不相连, ShapeType只能取Line)
public void polyline(float[] vertices, int offset, int count)
public void polyline(float[] vertices)

        说明:左下角为坐标原点,向右和向上分别为 x 轴和 y 轴正方向。 

2 ShapeRenderer 应用

2.1 绘制三角形

        MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.triangle(100, 100, 300, 100, 200, 300); // 绘制三角形mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.triangle(350, 100, 550, 100, 450, 300); // 绘制三角形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.2 绘制矩形

        MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.rect(100, 100, 200, 200); // 绘制矩形mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.rect(350, 100, 200, 300); // 绘制矩形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.3 绘制线框

        MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);shapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.rectLine(100, 100, 300, 300, 20); // 绘制线框(不填充)mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.rectLine(350, 100, 550, 300, 20); // 绘制线段(填充)mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.4 绘制多边形

        MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色drawPolygon5(); // 绘制正五边形drawPolygon6(); // 绘制正六边形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}private void drawPolygon5() { // 绘制正五边形float[] starVertices = calculatePolygonVertices(200, 250, 100, 5);mShapeRenderer.polygon(starVertices);}private void drawPolygon6() { // 绘制正六边形float[] starVertices = calculatePolygonVertices(450, 250, 100, 6);mShapeRenderer.polygon(starVertices);}private float[] calculatePolygonVertices(float x, float y, float size, int sides) { // 计算正n边形的顶点坐标float[] vertices = new float[sides * 2];for (int i = 0; i < sides * 2; i += 2) {float angleRad = (i / 2) * 360f / sides * (float) Math.PI / 180f;vertices[i] = x + size * (float) Math.cos(angleRad);vertices[i + 1] = y + size * (float) Math.sin(angleRad);}return vertices;}
}

        运行效果如下。

2.5 绘制圆形

         MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);shapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.circle(200, 250, 100); // 绘制圆形mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.circle(450, 250, 100); // 绘制圆形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.6 绘制椭圆

         MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.ellipse(100, 200, 200, 100); // 绘制椭圆形mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.ellipse(400, 150, 100, 200); // 绘制椭圆形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.7 绘制弧形

         MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;@Overridepublic void create () {mShapeRenderer = new ShapeRenderer();}@Overridepublic void render () {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(1, 0, 0, 1); // 设置图形颜色mShapeRenderer.arc(100, 200, 200, 0, 72); // 绘制扇形mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled); // ShapeType取值: Point、Line、FilledmShapeRenderer.setColor(0, 1, 0, 1); // 设置图形颜色mShapeRenderer.arc(450, 200, 100, 0, 300); // 绘制扇形mShapeRenderer.end();}@Overridepublic void dispose () {mShapeRenderer.dispose();}
}

        运行效果如下。

2.8 绘制立方体

         MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;private PerspectiveCamera mCamera;private float mRotationAngle;@Overridepublic void create() {mShapeRenderer = new ShapeRenderer();mCamera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());mCamera.position.set(5f, 5f, 5f);mCamera.lookAt(0, 0, 0);mCamera.near = 1f;mCamera.far = 100f;mCamera.update();mShapeRenderer.setProjectionMatrix(mCamera.combined);}@Overridepublic void render() {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line);mShapeRenderer.setColor(1, 0, 0, 1);rotate();mShapeRenderer.box(-2, 0, 0, 2, 2, 2); // 绘制立方体mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled);mShapeRenderer.setColor(0, 1, 0, 1);rotate();mShapeRenderer.box(2, 0, 0, 2, 2, 2); // 绘制立方体mShapeRenderer.end();}@Overridepublic void resize(int width, int height) {mCamera.viewportWidth = width;mCamera.viewportHeight = height;mCamera.update();mShapeRenderer.setProjectionMatrix(mCamera.combined);}@Overridepublic void dispose() {mShapeRenderer.dispose();}private void rotate() {mRotationAngle += Gdx.graphics.getDeltaTime() * 45f; // 每秒转45度mShapeRenderer.identity(); // 重置transformation矩阵mShapeRenderer.rotate(2, 2, 2, mRotationAngle);}
}

        运行效果如下。

2.9 绘制圆锥

         MyGame.java

package com.zhyan8.game;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;public class MyGame extends ApplicationAdapter {private ShapeRenderer mShapeRenderer;private PerspectiveCamera mCamera;private float mRotationAngle;@Overridepublic void create() {mShapeRenderer = new ShapeRenderer();mCamera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());mCamera.position.set(5f, 5f, 5f);mCamera.lookAt(0, 0, 0);mCamera.near = 1f;mCamera.far = 100f;mCamera.update();mShapeRenderer.setProjectionMatrix(mCamera.combined);}@Overridepublic void render() {Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);mShapeRenderer.begin(ShapeRenderer.ShapeType.Line);mShapeRenderer.setColor(1, 0, 0, 1);rotate();mShapeRenderer.cone(-2, 0, 0, 2, 2);mShapeRenderer.end();mShapeRenderer.begin(ShapeRenderer.ShapeType.Filled);mShapeRenderer.setColor(0, 1, 0, 1);rotate();mShapeRenderer.cone(2, 0, 0, 2, 2);mShapeRenderer.end();}@Overridepublic void resize(int width, int height) {mCamera.viewportWidth = width;mCamera.viewportHeight = height;mCamera.update();mShapeRenderer.setProjectionMatrix(mCamera.combined);}@Overridepublic void dispose() {mShapeRenderer.dispose();}private void rotate() {mRotationAngle += Gdx.graphics.getDeltaTime() * 45f; // 每秒转45度mShapeRenderer.identity(); // 重置transformation矩阵mShapeRenderer.rotate(2, 2, 2, mRotationAngle);}
}

        运行效果如下。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题-树】-- 572.另一棵树的子树

572.另一棵树的子树 方法&#xff1a;深度优先搜索暴力匹配 深度优先搜索枚举root中的每一个节点&#xff0c;判断这个点的子树是否与subroot相等 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right…

vue3项目安装eslint和prettier

【几乎最全/全网最长的 2 万 字】前端工程化完整流程&#xff1a;从头搭到尾&#xff08;vue3 vite qiankun docker tailwindcss iview......&#xff09;_前端工程化流程-CSDN博客 vue3tsvite项目中使用eslintprettierstylelinthusky指南 - 掘金 上面两篇文章相互结合操…

Gin框架源码解析

概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树&#xff08;基数树或者压缩前缀树&#xff09;、请求处理、路由方法树…

linux中利用fork复制进程,printf隐藏的缓冲区,写时拷贝技术,进程的逻辑地址与物理地址

1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h>int main(){printf…

【Java 进阶篇】Ajax 入门:打开前端异步交互的大门

欢迎来到前端异步交互的世界&#xff01;在这篇博客中&#xff0c;我们将深入探讨 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;&#xff0c;这是一项能够让你的网页在不刷新的情况下与服务器进行数据交互的技术。无论你是刚刚踏入前端开发的小白&#xff0c;…

4 redis的HyperLogLog入门原理

一、HyperLogLog&#xff08;字符串类型&#xff09; 需求&#xff1a;大型网站(不在大厂基本上用不到) 每个网页每天的 UV 数据(独立访客)&#xff0c;统计如何实现&#xff1f;(尽量少的占用存储空间) Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。Hyper…

学习网络编程No.10【深入学习HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/11/14/18:45&#xff0c;因为种种原因&#xff0c;上个月的文章昨天才更新&#xff0c;目前处于刷题前夕&#xff0c;算法课在看了。这次和以前不一样&#xff0c;因为以前对知识框架没有很好的理念&#xff0c;并不清楚相关知识要…

Vite - 静态资源处理 - json文件导入

直接就说明白了 vite 中对json 文件直接当作一个模块来解析。 可以直接导入使用&#xff01; 可以直接导入使用&#xff01; 可以直接导入使用&#xff01;json文件中的key&#xff0c;直接被作为一个属性&#xff0c;可以单独被导入。 因此&#xff0c;导入json文件有两种方式…

2024年csdn最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

SpringSecurity6 | 默认登录页

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

【LeetCode刷题-树】--1367.二叉树中的链表

1367.二叉树中的链表 方法&#xff1a;枚举 枚举二叉树中的每个节点为起点往下的路径是否与链表相匹配的路径&#xff0c;为了判断是否匹配设计了一个递归函数dfs(root,head),其中root表示当前匹配到的二叉树节点&#xff0c;head表示当前匹配到的链表节点&#xff0c;整个函数…

第7天:信息打点-资产泄漏amp;CMS识别amp;Git监控amp;SVNamp;DS_Storeamp;备份

第7天&#xff1a;信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份 知识点&#xff1a; 一、cms指纹识别获取方式 网上开源的程序&#xff0c;得到名字就可以搜索直接获取到源码。 cms在线识别&#xff1a; CMS识别&#xff1a;https://www.yun…