导入场景时,如果没有摄像机,创建一个缺省摄像机
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user