【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
The game object is deformed when the parent object is in non-uniform scaling.
先来看一下现象

有两个Cube, Cube1(Scale=2,1,1),Cube2(Scale=1,1,1)
将Cube2拖拽为Cube2的子对象。并且将position设置为(-0.6,1,0),也就是将Cube2置于Cube1上面并处于半悬空状态。为Cube2添加Rigidbody组件。点击“运行”。
这时,Cube2会在重力作用下向左倒下来,观察它的形状,会发现会拉长变形。
发现这个问题还是在研究如何将一个物体跟随平台进行移动时发现的。
网上给出的解决方法大多是将物体的父对象设置为平台。在测试时发现了物体变形的问题。
同样的,在Unity里编辑状态下,沿Y轴旋转Cube2,发现也会变形。

这是什么原因呢?
本质上还是父对象是非均匀缩放导致的。
首先来看下什么是非均匀缩放(non-uniform scaling)。
非均匀缩放是指 Transform 中的 Scale 具有不同的 x、y 和 z 值;例如 (2, 4, 2),也就是三轴上的缩放比例不一致。相反,均匀缩放具有相同的 x、y 和 z 值;例如 (3, 3, 3)。
那如何解决这个问题呢?
从Unity官方手册可以看到,还是提倡使用的3D模型保持均匀缩放的。当然如果我们在上面将Cube1的Scale设置为(1,1,1)时也不会出现这个问题。
1. 不要在 Transform 组件中调整GameObject 的比例。如果您以真实比例创建模型,则无需更改 Transform 的比例。您还可以调整导入网格的比例,因为某些优化会根据导入大小进行。请在单个网格的导入设置中执行此操作。实例化具有调整后的比例值的游戏对象可能会降低性能。
2. 如果子 GameObject 具有非均匀缩放的父 GameObject,并且相对于父 GameObject 旋转,则它可能会出现倾斜或“剪切”。有些组件支持简单的非均匀缩放,但在像这样倾斜时无法正常工作。例如,倾斜的盒子碰撞器与渲染网格的形状不准确匹配。
3. 非均匀缩放的父游戏对象的子游戏对象在旋转时不会自动更新其比例。因此,当您最终更新比例时,子游戏对象的形状可能会突然改变,例如,如果子游戏对象与父游戏对象分离。
但是有时候难免要调整对象的形状,尤其是使用Unity里的原生对象时。这时我们有什么方法呢?
方法一:比较简单,就是将子对象外部再加一个均匀缩放(Scale=1,1,1)的空对象。这样物体在移动或旋转时就不会变形。这种方法本质上还是避免了将物体作为非均匀缩放的子对象。
方法二:就是通过动态管理物体上的刚体实现。代码如下:
详细的解释请参考:如何实现物体跟随平台移动或旋转。
using UnityEngine;
using System.Collections.Generic;// CarryRigidbodies类负责让一系列Rigidbody对象跟随Unity GameObject移动。
public class CarryRigidbodies : MonoBehaviour
{// 存储所有应随本GameObject移动的Rigidbody对象的列表。public List<Rigidbody> rigidbodies = new List<Rigidbody>();// 存储上一帧物体的位置,用于计算移动距离。public Vector3 LastPosition;// 缓存当前GameObject的Transform组件。Transform _transform;// Start方法在脚本实例被激活时调用一次。void Start(){_transform = transform; // 初始化_transform为当前GameObject的Transform。LastPosition = _transform.position; // 初始化LastPosition为当前位置。}// LateUpdate在每一帧的Update函数调用之后调用。void LateUpdate(){// 如果列表中有Rigidbody对象,则处理它们的移动。if(rigidbodies.Count > 0){// 遍历所有的Rigidbody。for(int i = 0; i < rigidbodies.Count; i++){Rigidbody rb = rigidbodies[i];// 计算自上一帧以来的位置变化。Vector3 velocity = _transform.position - LastPosition;// 将位置变化应用到每个Rigidbody上。rb.transform.Translate(velocity, _transform);}}// 更新LastPosition为当前帧的位置。LastPosition = _transform.position;}// 当发生碰撞开始时调用。private void OnCollisionEnter(Collision other) {// 尝试从碰撞对象中获取Rigidbody组件。Rigidbody rb = other.collider.GetComponent<Rigidbody>();if(rb != null){// 如果存在Rigidbody,则添加到列表中。Add(rb);} }// 当碰撞结束时调用。private void OnCollisionExit(Collision other) {// 尝试从碰撞对象中获取Rigidbody组件。Rigidbody rb = other.collider.GetComponent<Rigidbody>();if(rb != null){// 如果存在Rigidbody,则从列表中移除。Remove(rb);} }// 添加一个Rigidbody到列表中,如果它尚未存在于列表中。void Add(Rigidbody rb){if(!rigidbodies.Contains(rb)){rigidbodies.Add(rb);}}// 从列表中移除一个Rigidbody,如果它存在于列表中。void Remove(Rigidbody rb){if(rigidbodies.Contains(rb)){rigidbodies.Remove(rb);}}
}
参考资料:
1. https://docs.unity3d.com/6000.0/Documentation/Manual/class-Transform.html
相关文章:
【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1(Scale2,1,1),Cube2(Scale1,1,1) 将Cube2拖拽为Cube2的子对象。并且将position设置为(-0.6,1,0&a…...
QT 跨平台实现 SSDP通信 支持多网卡
一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...
如何寻找适合的HTTP代理IP资源?
一、怎么找代理IP资源? 在选择代理IP资源的时候,很多小伙伴往往将可用率作为首要的参考指标。事实上,市面上的住宅IP或拨号VPS代理IP资源,其可用率普遍在95%以上,因此IP可用率并不是唯一的评判标准 其实更应该关注的…...
数据结构(ArrayList顺序表)
一、引言 1.什么是顺序表 定义: 顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。 底层依赖阵列,支持随机访问。元素之间没有额外的连接信息,如指针或链表节点。通过动态扩容…...
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...
RK3588-LinuxSDK安装
安装依赖软件 执行如下命令,安装 LinuxSDK 开发包依赖软件。 备注:安装过程中,请保证 Ubuntu 可正常访问互联网,若提示"*** is already the newest version ***"表示该软件已安装,请忽略。 Host# sudo apt-get install -y git ssh make gcc libssl-dev \ liblz…...
MATLAB 中有关figure图表绘制函数设计(论文中常用)
在撰写论文时,使用 MATLAB 导出的图像常常因大小和格式不统一,导致投稿时编辑部频繁退稿,要求修改和调整。这不仅浪费时间,也增加了工作量。为了减少这些麻烦,可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...
Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...
Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
一、自定义线程工厂 自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口,重写newThread方法。 示例代码: package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory; import java.util.conc…...
架构-微服务-服务网关
文章目录 前言一、网关介绍1. 什么是API网关2. 核心功能特性3. 解决方案 二、Gateway简介三、Gateway快速入门1. 基础版2. 增强版3. 简写版 四、Gateway核心架构1. 基本概念2. 执行流程 五、Gateway断言1. 内置路由断言工厂2. 自定义路由断言工厂 六、过滤器1. 基本概念2. 局部…...
基于springboot的HttpClient、OKhttp、RestTemplate对比
HttpClient详细 Httpclient基础!!!!实战训练!!!!-CSDN博客 OKhttp使用 OKhttp导包 <!-- ok的Http连接池 --><dependency><groupId>com.squareup.okhttp3</g…...
(计算机组成原理)期末复习
第一章 计算机的基本组成:硬件软件(程序)计算机系统 软件有系统软件(系统管理工具),应用软件 计算机硬件:包括主机和外设,主机包括CPU和内存,***CPU由运算器和控制器所组…...
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
本文不仅细化了每一个步骤,实现了从0到1部署Tomcat和添加servlet。还针对IDEA2024版和以前的版本在部署上的区别,做了详细介绍,尤其是add framework support部分。与此同时,针对控制台中文乱码问题,本文也给出了详细解…...
【Java从入门到放弃 之 Java程序基础】
Java程序基础 Java程序基础基本数据类型和变量数据类型变量赋值基本运算算术运算比较运算逻辑运算 Java程序基础 基本数据类型和变量 数据类型 对Java语言而言,有如下基本数据类型。 整数类型:有4种整型byte/short/int/long,它们占用的字…...
2024年11月26日Github流行趋势
项目名称:v2rayN 项目维护者:2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍:一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数:70,383 项目fork数:11,602 项目名称:fre…...
相亲交友小程序项目介绍
一、项目背景 在当今快节奏的社会生活中,人们忙于工作和事业,社交圈子相对狭窄,寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式,在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…...
使用ENSP实现默认路由
一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…...
CSGO游戏搬砖党如何应对上海Major
大家最近都关注major比赛了吗?目前已经有不少顶尖CSGO战队来到了上海,备战即将到来的2024上海Major赛。本次比赛正赛将于11月30日开打,欧洲、美洲和亚太地区的24支顶尖战队通过两周的角逐,包括揭幕赛、淘汰赛以及决赛三种…...
【人工智能】AutoML自动化机器学习模型构建与优化:使用Auto-sklearn与TPOT的实战指南
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 机器学习模型的构建和优化是一个复杂且耗时的过程,涉及特征工程、模型选择、超参数调优等多个环节。AutoML(Automated Machine Learning)旨在通过自动化的方式来简化这些流程,提高开发效率并提升模型表现。Au…...
go-zero(八) 中间件的使用
go-zero 中间件 一、中间件介绍 中间件(Middleware)是一个在请求和响应处理之间插入的程序或者函数,它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。 1.中间件的核心概念 请求拦截:中间件能够在请求到达目标处理器之…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
