You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:12:51