【Godot4.3】模拟平面图形绕轴或点在空间旋转

news2024/10/4 3:34:39

概述

平面图形,除了常规的线性变换:平移、缩放、旋转、斜切之外。还可以模仿在三维空间旋转、透视等等。

矩形绕纵对称轴旋转实点的轨迹

  • 绕对称旋转是个特殊情况,轨迹是圆也是为了便于理解。更实际的情况应该是椭圆。
  • 非对称轴旋转的情况轨迹更可能是同心椭圆。
  • 矩形更是个特殊情况,在一个矩形包围盒中的多边旋转,更是多个同心或非同心椭圆。

平面图形模拟空间中绕对称轴旋转示意图

旋转90度的特殊情况

测试代码

@tool
extends Node2D

var rect = Rect2(-50,-50,100,100)  # 透视图形
var points = ShapeTests.get_rect_points(rect)
var uvs = Points2D.Vec2Arr("1,0 0,0 0,1 1,1")

@export_range(-360.0,360.0,1.0) var theta = 0:
	set(val):
		theta = val
		queue_redraw()

@export var texture:Texture2D:
	set(val):
		texture = val
		queue_redraw()


func _draw() -> void:
	var top_c = rect.position + Vector2(rect.size.x/2.0,0) # 顶部中点
	var bot_c = rect.end - Vector2(rect.size.x/2.0,0)      # 底部中点
	var half_w = rect.size/2.0
	
	#draw_colored_polygon(points,Color.AQUAMARINE)
	
	
	
	var new_points = points.duplicate()
	new_points[0] = top_c + Vector2.LEFT.rotated(deg_to_rad(theta)) * half_w
	new_points[1] = top_c + Vector2.RIGHT.rotated(deg_to_rad(theta)) * half_w
	new_points[2] = bot_c + Vector2.RIGHT.rotated(deg_to_rad(-theta)) * half_w
	new_points[3] = bot_c + Vector2.LEFT.rotated(deg_to_rad(-theta)) * half_w
	
	
	draw_colored_polygon(new_points,Color.AQUAMARINE,uvs,texture)
	draw_circle(top_c,3,Color.ORANGE_RED)
	draw_circle(bot_c,3,Color.ORANGE_RED)

实现效果:

但是贴图会发生错误:

总结函数

# 将矩形沿Y轴旋转
func rotate_y(rect:Rect2,theta:float) -> PackedVector2Array:
	var ang = deg_to_rad(theta)
	var top_c = rect.position + Vector2(rect.size.x/2.0,0) # 顶部中点
	var bot_c = rect.end - Vector2(rect.size.x/2.0,0)      # 底部中点
	var half_w = rect.size/2.0
	
	var points = ShapeTests.get_rect_points(rect)
	points[0] = top_c + Vector2.LEFT.rotated(ang) * half_w
	points[1] = top_c + Vector2.RIGHT.rotated(ang) * half_w
	points[2] = bot_c + Vector2.RIGHT.rotated(-ang) * half_w
	points[3] = bot_c + Vector2.LEFT.rotated(-ang) * half_w
	return points

# 将矩形沿X轴旋转
func rotate_x(rect:Rect2,theta:float) -> PackedVector2Array:
	var ang = deg_to_rad(theta)
	var left_c = rect.position + Vector2(0,rect.size.y/2.0) # 顶部中点
	var right_c = rect.end - Vector2(0,rect.size.y/2.0)      # 底部中点
	var half_h = rect.size/2.0
	
	var points = ShapeTests.get_rect_points(rect)
	points[0] = left_c + Vector2.UP.rotated(ang) * half_h
	points[1] = left_c + Vector2.DOWN.rotated(ang) * half_h
	points[2] = right_c + Vector2.DOWN.rotated(-ang) * half_h
	points[3] = right_c + Vector2.UP.rotated(-ang) * half_h
	return points

注意:其实上面的代码中有一个Bug,就是half_w = rect.size/2.0half_h = rect.size/2.0,但是就是这个Bug莫名其妙的导致了边长不等的矩形旋转的的完美,有时候就是这样,哈哈哈…你根本不知道你的代码为什么顺利运行。

上述两个新函数已经作为静态函数库ShapeTests的静态方法,可以直接调用。

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

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

相关文章

Java 之深入理解 String、StringBuilder、StringBuffer

前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…

2024/10/3 408数据结构大题打卡

最短路径复习: bfs:只能解决无权图

【LeetCode每日一题】——17.电话号码的字母组合

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 中等 三【题目编号】 17.电话号码的字母组合 四【题目描述】 给定一个…

redis 5的安装及启动(window)

最近看大模型的时候发现入手redis的同学没有练手的,而且大部分redis的文章要钱才能看,在这里我把路径和环境配置,启动给大家说一下 下载 redis5的获取链接在下面(为什么是redis5,因为上个模型用的就是redis5&#xff…

pipe函数的例子

代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> int main(void) {int result -1;int fd[2],nbytes;pid_t pid;char string[80]"ni hao, pipe!";char readbuff…

linux信号 | 学习信号四步走 | 一篇文章教你理解信号如何保存

前言&#xff1a; 本节内容是信号的保存。 学习信号&#xff0c; 我们首先了解了信号的概念&#xff0c; 然后学习了信号的产生方式。 现在就开始讲解信号在时间窗口内是如何保存在进程内部的。 ps&#xff1a;本节内容需要了解信号的概念&#xff0c; 希望友友们了解一些信号…

实用技能分享!推荐最适合论文写作的5款ai工具

在当今学术研究和教育领域&#xff0c;AI工具的应用已经变得越来越普遍。这些工具不仅能够提高写作效率&#xff0c;还能帮助生成高质量的文稿。对于教师而言&#xff0c;选择合适的AI工具可以显著提升论文写作的效率和质量。本文将重点推荐五款最适合教师论文写作的AI工具&…

Linux聊天集群开发之环境准备

一.windows下远程操作Linux 第一步&#xff1a;在Linux终端下配置openssh&#xff0c;输入netstate -tanp,查看ssh服务是否启动&#xff0c;默认端口22.。 注&#xff1a;如果openssh服务&#xff0c;则需下载。输入命令ps -e|grep ssh, 查看如否配有&#xff0c; ssh-agent …

【重学 MySQL】四十六、创建表的方式

【重学 MySQL】四十六、创建表的方式 使用CREATE TABLE语句创建表使用CREATE TABLE LIKE语句创建表使用CREATE TABLE AS SELECT语句创建表使用CREATE TABLE SELECT语句创建表并从另一个表中选取数据&#xff08;与CREATE TABLE AS SELECT类似&#xff09;使用CREATE TEMPORARY …

【重学 MySQL】五十四、整型数据类型

【重学 MySQL】五十四、整型数据类型 整型类型TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff09;BIGINT 可选属性UNSIGNEDZEROFILL显示宽度&#xff08;M&#xff09;AUTO_INCREMENT注意事项 适合场景TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff0…

Python 从入门到实战33(使用MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

SLF4J(W): Class path contains multiple SLF4J providers.

问题背景 最近在给某AI项目集成阿里的通义千问SDK&#xff0c;发现竟然有个奇怪的报错&#xff0c;仔细一看发现&#xff0c;我类上用的lombok的Slf4j注释&#xff0c;阿里用的是org.slf4j.simple.SimpleServiceProvider&#xff0c;但是lombok用的是LogbackServiceProvider&a…

关于Vben Admin多标签页面缓存不生效的问题

情况说明 笔者在接手一个基于Vben Admin框架改造的vue3后台管理项目&#xff0c;客户要求在切换头部Tab页面时&#xff0c;不要刷新清空已经填写的表单页面或者表格。 然而&#xff0c;笔者根据Vben Admin的官方文档来配置多标签页面缓存后&#xff0c;页面每次切换后&#x…

Linux 应用层协议HTTP

文章目录 一、初始HTTP协议二、URL格式网络中怎么通过URL进行定位资源呢&#xff1f;编码和解码 三、HTTP的请求格式和响应格式HTTP的请求格式HTTP的响应格式HTTP的请求方法GET方法POST方法GET Vs PostHTTP的封装和分用文件流操作浏览器获得一个完整的网页流程 HTTP的状态码对3…

一、Linux下MySQL的安装与使用

文章目录 1. 基于docker安装mysql2. 字符集的相关操作2.1 修改MySQL5.7字符集2.2 各级别的字符集2.3 字符集与比较规则(了解)2.4 请求到响应过程中字符集的变化 3. SQL大小写规范3.1 Windows和Linux平台区别3.2 Linux下大小写规则设置3.3 SQL编写建议 4. sql_mode的合理设置4.1…

知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)

Neo4j简介 Neo4j 是一个基于图结构的 NoSQL 数据库&#xff0c;专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集&#xff0c;如社交网络、推荐系统、知识图谱等领域。 与传统的关系型数据库…

端侧大模型系列 | 端侧AI Agent任务拆解大师如何助力AI手机?(简短版)

引言 简介 模型 实验 意义&前景: 总结 引言 今人不见古时月&#xff0c;今月曾经照古人。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖沙茶面的小女孩。 设想一下&#xff0c;你的智能手机不再只是"聪明"&#xff0…

12.梯度下降法的具体解析——举足轻重的模型优化算法

引言 梯度下降法(Gradient Descent)是一种广泛应用于机器学习领域的基本优化算法&#xff0c;它通过迭代地调整模型参数&#xff0c;最小化损失函数以求得到模型最优解。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.知晓梯度下降法的具体流程 2.掌握不同梯度下降法…

力扣 中等 129.求根节点到叶子结点数字之和

文章目录 题目介绍解法 题目介绍 解法 法一&#xff1a;有返回值、 class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}public int dfs(TreeNode root, int x) {if (root null) {return 0;}x x * 10 root.val;if (root.left root.right) { //…

LC刷题专题:dfs、哈希表合集

自己刷题缺少分类思想&#xff0c;总是这里刷一道那里刷一道&#xff0c;以后建立几个专辑&#xff0c;然后自己新刷的同类型的题目都会即使更新上。 文章目录 690. 员工的重要性 690. 员工的重要性 2024-10-03 题目描述&#xff1a; 我第一次写并没有考虑到dfs&#xff0c;…