首页 > 编程语言 >体素化与旋转算法

体素化与旋转算法

时间:2024-10-22 10:43:22浏览次数:1  
标签:angle int 旋转 算法 vector var 体素化

一、旋转分类

目前游戏中只有绕y轴旋转的需求,因此讨论的都是基于y轴旋转的情况,所以图解都是俯视图。

分单x单、双x双和单x双三类:

  • 单x单:不管怎么转占位不变
  • 双x双:占位点无法在中心,导致旋转结果偏移,主点位置不变的情况下,旋转会产生“甩动感”
  • 单x双:同双x双


二、旋转算法

普遍算法

/// <summary>
/// 绕y轴旋转
/// </summary>
/// <param name="angle">角度</param>
/// <param name="point">单个点位坐标</param>
/// <returns></returns>
private static Vector3 RotatePointAroundY(int angle, Vector3 point)
{
	var q = Quaternion.AngleAxis(angle, Vector3.up);
	var vector = q * point;
	return vector;
}

限制整数点位

/// <summary>
/// 绕y轴旋转(限制整数坐标)
/// </summary>
/// <param name="angle">角度</param>
/// <param name="point">单个点位坐标</param>
/// <returns></returns>
public static Vector3Int RotatePointIntAroundY(int angle, Vector3Int point)
{
	var q = Quaternion.AngleAxis(angle, Vector3.up);
	var vector = q * point;
	var x = McMathUtils.SafeFloorToInt(vector.x);
	var y = McMathUtils.SafeFloorToInt(vector.y);
	var z = McMathUtils.SafeFloorToInt(vector.z);
	return new Vector3Int(x, y, z);
}

压缩至2D平面的算法(这里是只允许转90的算法,如果需要任意角度转,坐标类型从int改成float,且Cos和Sin不取整即可)

/// <summary>
/// 平面旋转算法(只允许90度旋转)
/// </summary>
/// <param name="x">初始x</param>
/// <param name="z">初始z</param>
/// <param name="angle">角度</param>
/// <param name="tx">结果x</param>
/// <param name="tz">结果z</param>
public static void Rotate2d(int x, int z, int angle, out int tx, out int tz)
{
	var rad = (360 - angle) * Mathf.Deg2Rad;
	var cos = (int)Mathf.Cos(rad);
	var sin = (int)Mathf.Sin(rad);
	tx = x * cos - z * sin;
	tz = x * sin + z * cos;
}

三、修建的旋转修正

为了避免旋转的甩动感,参考了小玩家的设计,思路大致是在旋转后,取玩家朝向的垂直轴(玩家朝z轴正方向,那么就取x轴,反之亦然),计算物件宽度的一半,并向下取整(更小的坐标对齐玩家位置)。图解如下:

四、重点注意

  • 游戏中旋转使用的是Unity的旋转方式(左手坐标系),与传统的右手坐标系相反。因此假设一个物体面朝z轴正方向,旋转-90度后其实是面朝x轴负方向,这里需要注意。
  • 体素旋转目前的方案是转Scope,也就是只转一个最小点min和一个最大点max,转完根据坐标更新min和max
  • 体素旋转的结果和外包围盒的结果不一致,要得到外包围盒的大小,需要对旋转后得到的max坐标加上一个Vector3.one

标签:angle,int,旋转,算法,vector,var,体素化
From: https://www.cnblogs.com/comradexiao/p/18492113

相关文章

  • 基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Ma
    ......
  • 《MATLAB 智能算法案例分析之遗传算法工具箱》
    一、理论基础《MATLAB智能算法案例分析之遗传算法工具箱》中,我们深入了解了谢菲尔德大学的MATLAB遗传算法工具箱。这一章节为我们后续学习和应用遗传算法奠定了坚实的基础。(一)遗传算法概述遗传算法(geneticalgorithm,GA)是一种进化算法,它模拟了生物界中的“物竞天择、适者......
  • 类欧几里得算法
    前言注:该文章不定期更新。Tips:建议阅读文章后自行推导,否则难以掌握。介绍类欧几里得算法是用\(O(\logn)\)的时间复杂度求解形似于\(f(a,b,c,n)=\sum\limits_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\)的函数的值的一种算法。由于其算法复杂度证明与扩展欧几里得算法......
  • 必学排序算法——归并排序
    目录前言一、什么是归并排序二、归并排序步骤三、算法思想四、归并排序复杂度分析五、优化方案六、算法图解七、c++代码模板八、经典例题1.排序数组代码题解2.排序链表代码题解九、结语前言归并排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,......
  • 二分算法
    今天学了二分算法:在一个有序的列表里找一个数,用for循环,每次比较中间的数和要找的数,要找的数大则将头移到中间的数的下一个数,否则将尾移到中间的数。(头算尾不算)这是代码:#include<bits/stdc++.h>usingnamespacestd;inta[100001];intbs(inta[],intl,intr,intx){ i......
  • 粒子群算法应用——LSTM神经网络优化
    本篇文章使用粒子群算法寻找LSTM神经网络最优隐含层数和学习率等参数来改善性能。粒子群算法详见:粒子群优化算法及应用-CSDN博客LSTM神经网络详细教程可参考:神经网络之lstm-CSDN博客本文公式描述部分来自:神经网络之lstm-CSDN博客目录1LSTM基本原理1.1 LSTM简介 1.2......
  • 编写HiveQL语句实现WordCount算法
    确保启动hadooop和hive  创建测试文件echo"helloworld">file1.txtecho"hellohadoop">file2.txt#创建HDFS上的/input目录hdfsdfs-mkdir-p/input#将本地文件上传到HDFShdfsdfs-putfile1.txt/input/hdfsdfs-putfile2.txt/input/打开Hiveshell......
  • 基于深度学习CNN算法的花卉分类识别系统01-python-带UI-包配置
    项目基本介绍:【算法】深度学习CNN网络mobilenet算法网络【环境】python>=3.8pytorchopencvpyqt5matplotlib(含详细环境配置教程视频)【文件】训练、预测全部源代码、训练好的模型、数据集、模型评价指标:训练acc/loss曲线图和混淆矩阵图、U1界面源码及源文件、环境配置......
  • python基于深度学习算法的手写汉字识别-带UI界面-包环境配置运行
    1)项目基本介绍网络:深度学习CNN网络简单搭建的CNN网络环境:python>=3.5tensorflow2opencvpyqt5文件:训练预测全部源代码、训练好的模型、数据集可对20个汉字进行识别检测,配置好环境即可使用。......
  • 深度学习CNN算法狗类识别系统01-python带pyqt5界面数据集包配置
    项目基本介绍:【算法】深度学习CNN网络xception算法网络【环境】python=3.8pytorchopencvpyqt5matplotlib(含详细环境配置教程视频)【文件】训练、预测全部源代码、训练好的型、数据集、模型评价指标:训练acc/loss曲线图和混淆矩阵图、UI界面源码及源文件、环境配置教程视......