Как показать позу модели 3D в виде сцены в студии AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как показать позу модели 3D в виде сцены в студии Android

Сообщение Anonymous »

Я успешно экспортировал свою 3D-модель из Blender (файл .glb) и открыл ее в Т-позе в представлении сцены в Android Studio. Кадрирование и вращение в порядке.
Однако, когда я пытаюсь загрузить позу, 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"
Вот код Kotlin, который я использую, чтобы попытаться отобразить одну позу (animationName) из glb (assetPath):

Код: Выделить всё

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
}
}
А вот код Java для моего действия, который вызывает функцию Kotlin для позы «pose1» glb «model3D.glb»:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»