Однако, когда я пытаюсь загрузить позу, 3D-модель остается в Т-позе, а камера прилипает к земле и становится неуправляемой.
Мой импортированный файл .glb в Android Studio содержит три позы: «поза1», «поза2» и «поза3» (это анимации с одним кадром 1). Я проверил их наличие и работоспособность в онлайн-просмотрщиках https://gltf-viewer.donmccurdy.com/ и https://sandbox.babylonjs.com/. Таким образом, проблема, похоже, не в самом файле .glb.
Я начал со своего кода, который правильно отображал 3D-модель в Т-позе:
- Создал экземпляр FilamentInstance,
- Добавил объекты в этот экземпляр,
- Расположил камеру,
- Заменил cameraManipulator на новый, чтобы запоминать положение камеры во время вращения.
Я попробовал еще раз, используя узел модели (который, согласно моим исследованиям, инкапсулирует экземпляр нити, поэтому это безопаснее и рекомендуется). Но мне все равно не лучше: поза не загружается, а камера приклеена к земле.
Что я вижу на экране при отображении сцены (персонаж в Т-позе)
Можете помочь? Я разочарован.
Вот ссылка на вид сцены, который я использую:
Код: Выделить всё
implementation "io.github.sceneview:sceneview:2.3.3"
Код: Выделить всё
package com.MyAndroidStudioProject
import android.util.Log
import com.google.android.filament.gltfio.FilamentInstance
import io.github.sceneview.SceneView
import io.github.sceneview.math.Position
import io.github.sceneview.math.toFloat3
object ModelLoaderHelper {
@JvmStatic
fun displaySinglePose(
sceneView: SceneView,
assetPath: String,
animationName: String
): io.github.sceneview.node.ModelNode {
// 1️⃣ Charger l'instance GLB
val instance = sceneView.modelLoader.createModelInstance(assetPath)
// 2️⃣ Créer le ModelNode
val modelNode = io.github.sceneview.node.ModelNode(instance)
// 3️⃣ Ajouter à la scène
sceneView.addChildNode(modelNode)
// 4️⃣ Post pour attendre que le node soit attaché
sceneView.post {
val animator = instance.animator
if (animator != null) {
// Cherche l'index de l'animation par son nom
var animIndex = -1
for (i in 0 until animator.animationCount) {
if (animator.getAnimationName(i) == animationName) {
animIndex = i
break
}
}
if (animIndex != -1) {
// Applique la première frame
animator.applyAnimation(animIndex, 0f)
animator.updateBoneMatrices()
} else {
Log.e("SceneViewPose", "Animation '$animationName' introuvable")
}
} else {
Log.e("SceneViewPose", "Animator non disponible sur cette instance")
}
// 5️⃣ Caméra centrée et reculée
val box = modelNode.boundingBox
val center = box.center
val half = box.halfExtent
val centerX = center[0]
val centerY = center[1]
val centerZ = center[2]
val maxHalf = maxOf(half[0], half[1], half[2])
val distance = maxHalf * 2.5f
sceneView.cameraNode.position = dev.romainguy.kotlin.math.Float3(
centerX,
centerY + maxHalf,
centerZ + distance
)
sceneView.cameraNode.lookAt(
targetWorldPosition = dev.romainguy.kotlin.math.Float3(centerX, centerY, centerZ),
upDirection = dev.romainguy.kotlin.math.Float3(0f, 1f, 0f),
smooth = false,
smoothSpeed = 0f
)
}
return modelNode
}
}
Код: Выделить всё
try {
String animationNameToLoad = "pose1";
String assetPathToLoad = "models/model3D.glb";
io.github.sceneview.node.ModelNode modelNode =
ModelLoaderHelper.displaySinglePose(
sceneView,
assetPathToLoad,
animationNameToLoad
);
} catch (Exception e) {
e.printStackTrace();
} finally {
progress.setVisibility(View.GONE);
}
Заранее спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/798 ... oid-studio
Мобильная версия