【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.中间件的核心概念 请求拦截:中间件能够在请求到达目标处理器之…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...