【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.中间件的核心概念 请求拦截:中间件能够在请求到达目标处理器之…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
