Skip to content

Commit 0629da4

Browse files
committed
[ModifiedMayaCamera] setZoomAndRotationBasedOnTargetAndPosition
temp hack before rewrite to make the camera work with initial params.
1 parent fa3af5b commit 0629da4

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "nbl/ext/MitsubaLoader/CMitsubaLoader.h"
1515
#include "CommandLineHandler.hpp"
1616

17+
#include "CSceneNodeAnimatorCameraModifiedMaya.h"
1718
#include "Renderer.h"
1819

1920

@@ -204,7 +205,7 @@ int main(int argc, char** argv)
204205
auto up = tpose.rows[1];
205206
core::vectorSIMDf view = tpose.rows[2];
206207
auto target = view+pos;
207-
208+
208209
camera->setTarget(target.getAsVector3df());
209210
if (core::dot(core::normalize(core::cross(camera->getUpVector(),view)),core::cross(up,view)).x<0.99f)
210211
camera->setUpVector(up);
@@ -278,11 +279,14 @@ int main(int argc, char** argv)
278279
camera->setNearValue(20.f);
279280
camera->setFarValue(5000.f);
280281
}
281-
282+
283+
auto modifiedMayaAnim = reinterpret_cast<scene::CSceneNodeAnimatorCameraModifiedMaya*>(camera->getAnimators()[0]);
284+
core::vectorSIMDf cameraPos; cameraPos.set(camera->getPosition());
285+
core::vectorSIMDf cameraTarget; cameraTarget.set(camera->getTarget());
286+
modifiedMayaAnim->setZoomAndRotationBasedOnTargetAndPosition(cameraPos, cameraTarget);
282287

283288
auto driver = device->getVideoDriver();
284289

285-
286290
core::smart_refctd_ptr<Renderer> renderer = core::make_smart_refctd_ptr<Renderer>(driver,device->getAssetManager(),smgr);
287291
constexpr uint32_t MaxSamples = MAX_ACCUMULATED_SAMPLES;
288292
auto sampleSequence = core::make_smart_refctd_ptr<asset::ICPUBuffer>(sizeof(uint32_t)*MaxSamples*Renderer::MaxDimensions);
@@ -330,12 +334,10 @@ int main(int argc, char** argv)
330334

331335
renderer->init(meshes, std::move(sampleSequence));
332336
meshes = {}; // free memory
333-
334337

335338
auto extent = renderer->getSceneBound().getExtent();
336339
smgr->setActiveCamera(camera);
337340

338-
339341
QToQuitEventReceiver receiver;
340342
device->setEventReceiver(&receiver);
341343

@@ -345,7 +347,11 @@ int main(int argc, char** argv)
345347
{
346348
driver->beginScene(false, false);
347349

350+
std::cout << "Camera Position Before Render: (" << camera->getPosition().X << "," << camera->getPosition().Y << "," << camera->getPosition().Z << ")" << std::endl;
351+
std::cout << "Target Before Render: (" << camera->getTarget().X << "," << camera->getTarget().Y << "," << camera->getTarget().Z << ")" << std::endl;
348352
renderer->render(device->getTimer());
353+
std::cout << "Camera Position After Render: (" << camera->getPosition().X << "," << camera->getPosition().Y << "," << camera->getPosition().Z << ")" << std::endl;
354+
std::cout << "Target After Render: (" << camera->getTarget().X << "," << camera->getTarget().Y << "," << camera->getTarget().Z << ")" << std::endl;
349355

350356
auto oldVP = driver->getViewPort();
351357
driver->blitRenderTargets(renderer->getColorBuffer(),nullptr,false,false,{},{},true);

source/Nabla/CSceneNodeAnimatorCameraModifiedMaya.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ CSceneNodeAnimatorCameraModifiedMaya::CSceneNodeAnimatorCameraModifiedMaya(gui::
3939
allKeysUp();
4040
}
4141

42-
4342
//! destructor
4443
CSceneNodeAnimatorCameraModifiedMaya::~CSceneNodeAnimatorCameraModifiedMaya()
4544
{
@@ -48,6 +47,33 @@ CSceneNodeAnimatorCameraModifiedMaya::~CSceneNodeAnimatorCameraModifiedMaya()
4847
}
4948

5049

50+
void CSceneNodeAnimatorCameraModifiedMaya::setZoomAndRotationBasedOnTargetAndPosition(const core::vectorSIMDf& position, const core::vectorSIMDf& target)
51+
{
52+
core::vectorSIMDf relativeTarget = position - target;
53+
// core::vector3df relativeRotation = relativeTarget.getAsVector3df().getHorizontalAngle();
54+
float angleX = 0.0f;
55+
float angleY = 0.0f;
56+
57+
const double tmp = core::degrees(atan2((double)relativeTarget.z, (double)relativeTarget.x));
58+
angleX = tmp;
59+
if (angleX < 0)
60+
angleX += 360;
61+
if (angleX >= 360)
62+
angleX -= 360;
63+
64+
const double z1 = core::sqrt(relativeTarget.x*relativeTarget.x + relativeTarget.z*relativeTarget.z);
65+
angleY = (core::degrees(atan2((double)relativeTarget.y, (double)z1)) - 0.0);
66+
if (angleY < 0)
67+
angleY += 360;
68+
if (angleY >= 360)
69+
angleY -= 360;
70+
71+
CurrentZoom = core::sqrt(core::dot(relativeTarget, relativeTarget)[0]);
72+
OldTarget = target;
73+
RotX = 360-angleX;
74+
RotY = angleY;
75+
}
76+
5177
//! It is possible to send mouse and key events to the camera. Most cameras
5278
//! may ignore this input, but camera scene nodes which are created for
5379
//! example with scene::ISceneManager::addMayaCameraSceneNode or
@@ -286,7 +312,7 @@ void CSceneNodeAnimatorCameraModifiedMaya::animateNode(IDummyTransformationScene
286312
position.X = CurrentZoom + target.X;
287313
position.Y = target.Y;
288314
position.Z = target.Z;
289-
315+
290316
position.rotateXYByRAD(core::radians(nRotY), target);
291317
position.rotateXZByRAD(-core::radians(nRotX), target);
292318

source/Nabla/CSceneNodeAnimatorCameraModifiedMaya.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ namespace nbl
8282
//! Enable/disable zooming when right button is pressed
8383
virtual void toggleZoomWithRightButton() override;
8484

85+
void setZoomAndRotationBasedOnTargetAndPosition(const core::vectorSIMDf& position, const core::vectorSIMDf& target);
86+
8587
private:
8688
void allKeysUp();
8789
void animate();

0 commit comments

Comments
 (0)