LibGDX ModelInstance缩放无法重置:设置变换时模型变形求助
解决带缩放的ModelInstance使用transform.set导致变形的问题
嘿,这个问题我之前在处理3D变换时也踩过一模一样的坑,太懂看到箭头突然扭曲变形那种崩溃感了!让我给你拆解下问题根源和靠谱的解决办法:
问题到底出在哪?
你用的arrow[j].transform.set(modelInstance[i].transform.getTranslation(...), ...)这个方法,本质是直接替换箭头的整个变换矩阵——它会把你之前辛辛苦苦给箭头设置的自定义缩放比例,直接覆盖成目标部件的默认缩放(通常是1),所以箭头瞬间就失去了原本的尺寸,出现变形。
正确的处理思路:只改需要变的部分
我们要做的是保留箭头原有的缩放信息,只更新位置和旋转,而不是替换整个transform:
1. 仅更新箭头位置(保留缩放和旋转)
如果箭头不需要和部件同方向,只需要移动到部件位置,直接单独设置平移即可:
// 获取目标部件的位置 Vector3 targetPosition = modelInstance[i].transform.getTranslation(new Vector3()); // 只更新箭头的位置,原缩放和旋转完全保留 arrow[j].transform.setTranslation(targetPosition);
2. 同时更新位置和旋转(保留缩放)
如果箭头需要和部件保持相同的朝向,分开设置旋转和平移就行,绝对不要用set()一次性覆盖整个变换:
// 获取目标部件的旋转和位置 Quaternion targetRotation = modelInstance[i].transform.getRotation(new Quaternion()); Vector3 targetPosition = modelInstance[i].transform.getTranslation(new Vector3()); // 先设置旋转,再设置位置(顺序不影响缩放) arrow[j].transform.setRotation(targetRotation); arrow[j].transform.setTranslation(targetPosition);
3. 正确设置箭头的固定缩放比例
另外你提到的“找不到重置缩放的方法”,之前用transform.scale(-currentScale, ...)导致反转变大,是因为scale()是叠加缩放(每次调用都会在现有缩放基础上相乘),不是设置固定值。要给箭头设置固定缩放比例,直接修改transform的scale分量就行:
// 假设你需要箭头缩放到原大小的0.7倍,适配部件尺寸 float desiredScale = 0.7f; arrow[j].transform.scale.set(desiredScale, desiredScale, desiredScale);
完整流程示例
给你一个初始化+更新的代码片段参考,直接就能用:
// 初始化箭头时,设置好固定缩放 public void initArrows() { for (int j = 0; j < arrow.length; j++) { // 加载箭头ModelInstance的逻辑... // 根据部件大小设置箭头的初始缩放 arrow[j].transform.scale.set(0.6f, 0.6f, 0.6f); } } // 选中部件时更新箭头位置/旋转 public void onPartSelected(int partIndex) { ModelInstance selectedPart = modelInstance[partIndex]; // 获取目标部件的位置和旋转信息 Vector3 targetPos = selectedPart.transform.getTranslation(new Vector3()); Quaternion targetRot = selectedPart.transform.getRotation(new Quaternion()); for (int j = 0; j < arrow.length; j++) { // 只更新位置和旋转,完全保留箭头的缩放设置 arrow[j].transform.setTranslation(targetPos); arrow[j].transform.setRotation(targetRot); } }
这样操作后,不管箭头有没有缩放,移动时都不会再变形,还能一直保持你需要的尺寸~
内容的提问来源于stack exchange,提问作者user11764175
相关产品推荐
相关产品推荐

