From 83e5f7e0407a6791f978314dff7907df6ad5591d Mon Sep 17 00:00:00 2001 From: thejinchao Date: Wed, 8 Oct 2025 17:39:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=9C=BA=E6=99=AF=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=B2=A1=E6=9C=89=E6=91=84=E5=83=8F?= =?UTF-8?q?=E6=9C=BA=EF=BC=8C=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA=E7=BC=BA?= =?UTF-8?q?=E7=9C=81=E6=91=84=E5=83=8F=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/utils/CMakeLists.txt | 15 +++++ .../utils/include/camera/dvu_default_camera.h | 10 ++++ .../source/camera/dvu_default_camera.cpp | 55 +++++++++++++++++++ source/utils/source/scene/dvu_load_gltf.cpp | 20 +++++++ 4 files changed, 100 insertions(+) create mode 100644 source/utils/include/camera/dvu_default_camera.h create mode 100644 source/utils/source/camera/dvu_default_camera.cpp diff --git a/source/utils/CMakeLists.txt b/source/utils/CMakeLists.txt index 9993638..379df84 100644 --- a/source/utils/CMakeLists.txt +++ b/source/utils/CMakeLists.txt @@ -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 diff --git a/source/utils/include/camera/dvu_default_camera.h b/source/utils/include/camera/dvu_default_camera.h new file mode 100644 index 0000000..5ba1287 --- /dev/null +++ b/source/utils/include/camera/dvu_default_camera.h @@ -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 diff --git a/source/utils/source/camera/dvu_default_camera.cpp b/source/utils/source/camera/dvu_default_camera.cpp new file mode 100644 index 0000000..fd479ab --- /dev/null +++ b/source/utils/source/camera/dvu_default_camera.cpp @@ -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(sceneNode); + cameraComponent->setCameraDefine(cameraDefine); + sceneNode->addComponent(std::dynamic_pointer_cast(cameraComponent)); + + //add to scene root node + scene.getRootSceneNode()->addChild(sceneNode); + return true; +} + +DV_UTILS_END_NAMESPACE diff --git a/source/utils/source/scene/dvu_load_gltf.cpp b/source/utils/source/scene/dvu_load_gltf.cpp index 0544e47..7745602 100644 --- a/source/utils/source/scene/dvu_load_gltf.cpp +++ b/source/utils/source/scene/dvu_load_gltf.cpp @@ -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(); + if (cameraNode.get()==nullptr) + { + create_default_camera(scene); + } + return true; }