导入场景时,如果没有摄像机,创建一个缺省摄像机

This commit is contained in:
2025-10-08 17:39:14 +08:00
parent ef2e7654e2
commit 83e5f7e040
4 changed files with 100 additions and 0 deletions
+15
View File
@@ -30,6 +30,19 @@ set(DV_UTILS_SCENE_SOURCE_FILES
)
source_group("source/scene" FILES ${DV_UTILS_SCENE_SOURCE_FILES})
#################
# camera
#################
set(DV_UTILS_CAMERA_INCLUDE_FILES
include/camera/dvu_default_camera.h
)
source_group("include/camera" FILES ${DV_UTILS_CAMERA_INCLUDE_FILES})
set(DV_UTILS_CAMERA_SOURCE_FILES
source/camera/dvu_default_camera.cpp
)
source_group("source/camera" FILES ${DV_UTILS_CAMERA_SOURCE_FILES})
include_directories(
${DV_AUTO_INCLUDE_PATH}
${DV_CORE_INCLUDE_PATH}
@@ -43,6 +56,8 @@ add_library(dv_utils SHARED
${DV_UTILS_SCENE_SOURCE_FILES}
${DV_UTILS_BUFFER_INCLUDE_FILES}
${DV_UTILS_BUFFER_SOURCE_FILES}
${DV_UTILS_CAMERA_INCLUDE_FILES}
${DV_UTILS_CAMERA_SOURCE_FILES}
)
target_link_libraries(dv_utils
@@ -0,0 +1,10 @@
#pragma once
#include "dvu_config.h"
#include "scene/dvc_scene.h"
DV_UTILS_BEGIN_NAMESPACE
bool DV_UTILS_API create_default_camera(davinci::Scene& scene);
DV_UTILS_END_NAMESPACE
@@ -0,0 +1,55 @@
#include "camera/dvu_default_camera.h"
#include "scene/dvc_scene_node.h"
#include "scene/component/dvc_camera_component.h"
#include "math/dvc_matrix4.h"
#include "math/dvc_vector3.h"
#include "math/dvc_vector4.h"
DV_UTILS_BEGIN_NAMESPACE
bool create_default_camera(davinci::Scene& scene)
{
//------default camera define
static const davinci::fVector4 kDefaultCameraRotation(
-0.20997299253940582f, 0.3857799470424652f, 0.09062844514846802f, 0.8937962055206299f);
static const davinci::fVector3 kDefaultCameraTranslation(
7.358891487121582f, 4.958309173583984f, 6.925790786743164f);
static const float kDefaultCameraAspectRatio = 1.7777777777777777f;
static const float kDefaultCamaraFov = 0.39959652046304894f;
static const float kDefaultCameraNearClip = 0.1f;
static const float kDefaultCameraFarClip = 100.f;
//-----default camera define
//create camera scene node
davinci::SceneNodePtr sceneNode = scene.newSceneNode("__DEFAULT_CAMERA__");
//transform
davinci::fMatrix4 transform = davinci::fMatrix4::IDENTITY;
//rotation
transform = davinci::fMatrix4::makeRotate(kDefaultCameraRotation) * transform;
//translation
transform = davinci::fMatrix4::makeTrans(kDefaultCameraTranslation) * transform;
sceneNode->setTransform(transform);
//camera define
davinci::CameraComponent::CameraDefine cameraDefine;
cameraDefine.aspect = kDefaultCameraAspectRatio;
cameraDefine.fov = kDefaultCamaraFov;
cameraDefine.nearClip = kDefaultCameraNearClip;
cameraDefine.farClip = kDefaultCameraFarClip;
//camera component
davinci::CameraComponentPtr cameraComponent = std::make_shared<davinci::CameraComponent>(sceneNode);
cameraComponent->setCameraDefine(cameraDefine);
sceneNode->addComponent(std::dynamic_pointer_cast<davinci::SceneComponent>(cameraComponent));
//add to scene root node
scene.getRootSceneNode()->addChild(sceneNode);
return true;
}
DV_UTILS_END_NAMESPACE
@@ -1,4 +1,8 @@
//
// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
//
#include "scene/dvu_load_gltf.h"
#include "camera/dvu_default_camera.h"
#include "scene/dvc_scene.h"
#include "scene/dvc_scene_node.h"
#include "scene/component/dvc_mesh_component.h"
@@ -321,6 +325,15 @@ bool _loadSceneNodes(const tinygltf::Model& gltfModel, davinci::Scene& scene, co
{
transform = davinci::fMatrix4::makeTrans(gltfNode.translation[0], gltfNode.translation[1], gltfNode.translation[2]) * transform;
}
if(!gltfNode.matrix.empty())
{
davinci::fMatrix4 matrix(
gltfNode.matrix[0], gltfNode.matrix[1], gltfNode.matrix[2], gltfNode.matrix[3],
gltfNode.matrix[4], gltfNode.matrix[5], gltfNode.matrix[6], gltfNode.matrix[7],
gltfNode.matrix[8], gltfNode.matrix[9], gltfNode.matrix[10], gltfNode.matrix[11],
gltfNode.matrix[12], gltfNode.matrix[13], gltfNode.matrix[14], gltfNode.matrix[15]);
transform = matrix.transpose() * transform;
}
sceneNode->setTransform(transform);
//add mesh component
@@ -515,6 +528,13 @@ bool load_scene_from_gltf(const char* szSceneFiles, davinci::Scene& scene)
return false;
}
//create default camera
davinci::SceneNodeConstPtr cameraNode = scene.getNodeWithComponent<davinci::CameraComponent>();
if (cameraNode.get()==nullptr)
{
create_default_camera(scene);
}
return true;
}