From 68b6c39b2b0ad88a3aeb1090da20b66cf0407ab1 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Wed, 10 Apr 2024 16:20:14 +0800
Subject: [PATCH 1/7] panorama camera
---
ui/zenoedit/dialog/zrecorddlg.ui | 20 ++++++++++++++++++++
zenovis/xinxinoptix/PTKernel.cu | 19 +++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/ui/zenoedit/dialog/zrecorddlg.ui b/ui/zenoedit/dialog/zrecorddlg.ui
index 71c3a8ed68..7b27864e41 100644
--- a/ui/zenoedit/dialog/zrecorddlg.ui
+++ b/ui/zenoedit/dialog/zrecorddlg.ui
@@ -180,6 +180,26 @@
+ -
+
+
+ PanoramaCamera
+
+
+ false
+
+
+
+ -
+
+
+ Hemisphere
+
+
+ false
+
+
+
-
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index 75dfd235fb..ed0214b030 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -199,6 +199,25 @@ extern "C" __global__ void __raygen__rg()
float3 ray_origin = eye_shake;
float3 ray_direction = terminal_point - eye_shake;
ray_direction = normalize(ray_direction);
+ int panorama = 1;
+ int hemisphere = 1;
+ if (panorama) {
+ float phi = (float(idx.x) + subpixel_jitter.x) / float(w) * 2.0f * M_PIf;
+ if (hemisphere) {
+ phi = ((float(idx.x) + subpixel_jitter.x) / float(w) + 0.5f) * M_PIf;
+ }
+ float theta = (float(idx.y) + subpixel_jitter.y) / float(h) * M_PIf;
+ float y = -cosf(theta);
+ float z = sinf(theta) * cosf(phi);
+ float x = sinf(theta) * sinf(-phi);
+
+ mat3 camera_transform = mat3(
+ cam.right.x, cam.up.x, -cam.front.x,
+ cam.right.y, cam.up.y, -cam.front.y,
+ cam.right.z, cam.up.z, -cam.front.z
+ );
+ ray_direction = camera_transform * make_float3(x, y, z);
+ }
RadiancePRD prd;
prd.pixel_area = cam.height/(float)(h)/(cam.focal_length);
From ef3dfb4e7766eaabb586de4b4310ad882b663ac6 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Wed, 10 Apr 2024 19:03:57 +0800
Subject: [PATCH 2/7] ui
---
ui/zenoedit/dialog/ZOptixCameraSetting.cpp | 16 ++++++++++++++++
ui/zenoedit/viewport/optixviewport.cpp | 10 ++++++++--
ui/zenoedit/viewport/optixviewport.h | 4 ++--
zeno/src/nodes/CameraNodes.cpp | 5 +++++
zenovis/include/zenovis/Camera.h | 4 +++-
zenovis/src/Camera.cpp | 4 +++-
zenovis/src/optx/RenderEngineOptx.cpp | 12 +++++++++---
zenovis/xinxinoptix/PTKernel.cu | 6 ++----
zenovis/xinxinoptix/optixPathTracer.cpp | 4 +++-
zenovis/xinxinoptix/optixPathTracer.h | 2 ++
zenovis/xinxinoptix/xinxinoptixapi.h | 2 +-
11 files changed, 54 insertions(+), 15 deletions(-)
diff --git a/ui/zenoedit/dialog/ZOptixCameraSetting.cpp b/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
index 623e79ef5d..a14609fb40 100644
--- a/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
+++ b/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
@@ -44,6 +44,14 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
m_exposure->setStyleSheet("color: white;");
m_exposure->setChecked(info.exposure);
+ QCheckBox *m_panorama_camera = new QCheckBox(tr("PanoramaCamera"));
+ m_panorama_camera->setStyleSheet("color: white;");
+ m_panorama_camera->setChecked(info.panorama_camera);
+
+ QCheckBox *m_panorama_hemisphere = new QCheckBox(tr("PanoramaHemisphere"));
+ m_panorama_hemisphere->setStyleSheet("color: white;");
+ m_panorama_hemisphere->setChecked(info.panorama_hemisphere);
+
mainLayout->addWidget(new QLabel("Aperture"));
mainLayout->addWidget(m_aperture);
mainLayout->addWidget(new QLabel("ShutterSpeed"));
@@ -52,6 +60,8 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
mainLayout->addWidget(m_iso);
mainLayout->addWidget(m_aces);
mainLayout->addWidget(m_exposure);
+ mainLayout->addWidget(m_panorama_camera);
+ mainLayout->addWidget(m_panorama_hemisphere);
mainLayout->addLayout(buttonLayout);
@@ -78,5 +88,11 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
connect(m_exposure, &QCheckBox::stateChanged, this, [&](int state) {
info.exposure = state == Qt::Checked;
});
+ connect(m_panorama_camera, &QCheckBox::stateChanged, this, [&](int state) {
+ info.panorama_camera = state == Qt::Checked;
+ });
+ connect(m_panorama_hemisphere, &QCheckBox::stateChanged, this, [&](int state) {
+ info.panorama_hemisphere = state == Qt::Checked;
+ });
}
diff --git a/ui/zenoedit/viewport/optixviewport.cpp b/ui/zenoedit/viewport/optixviewport.cpp
index cb85615c84..726dde82b4 100644
--- a/ui/zenoedit/viewport/optixviewport.cpp
+++ b/ui/zenoedit/viewport/optixviewport.cpp
@@ -351,7 +351,9 @@ void OptixWorker::onSetData(
float shutter_speed,
float iso,
bool aces,
- bool exposure
+ bool exposure,
+ bool panorama_camera,
+ bool panorama_hemisphere
) {
// zeno::log_info("I am in optix thread, now I want to set value {}", iso);
auto scene = m_zenoVis->getSession()->get_scene();
@@ -360,6 +362,8 @@ void OptixWorker::onSetData(
scene->camera->zOptixCameraSettingInfo.iso = iso;
scene->camera->zOptixCameraSettingInfo.aces = aces;
scene->camera->zOptixCameraSettingInfo.exposure = exposure;
+ scene->camera->zOptixCameraSettingInfo.panorama_camera = panorama_camera;
+ scene->camera->zOptixCameraSettingInfo.panorama_hemisphere = panorama_hemisphere;
scene->drawOptions->needRefresh = true;
}
@@ -454,7 +458,9 @@ void ZOptixViewport::setdata_on_optix_thread(zenovis::ZOptixCameraSettingInfo va
value.shutter_speed,
value.iso,
value.aces,
- value.exposure
+ value.exposure,
+ value.panorama_camera,
+ value.panorama_hemisphere
);
}
diff --git a/ui/zenoedit/viewport/optixviewport.h b/ui/zenoedit/viewport/optixviewport.h
index d7ef63a06b..debc0b4680 100644
--- a/ui/zenoedit/viewport/optixviewport.h
+++ b/ui/zenoedit/viewport/optixviewport.h
@@ -44,7 +44,7 @@ public slots:
void onCleanUpScene();
void onSetBackground(bool bShowBg);
- void onSetData(float, float, float, bool, bool);
+ void onSetData(float, float, float, bool, bool, bool, bool);
private:
Zenovis *m_zenoVis;
@@ -108,7 +108,7 @@ class ZOptixViewport : public QWidget
void sig_updateCameraProp(float aperture, float disPlane, UI_VECTYPE skipParam = UI_VECTYPE());
void sig_cleanUpScene();
void sig_setBackground(bool bShowBg);
- void sig_setdata_on_optix_thread(float, float, float, bool, bool);
+ void sig_setdata_on_optix_thread(float, float, float, bool, bool, bool, bool);
public slots:
void onFrameRunFinished(int frame);
diff --git a/zeno/src/nodes/CameraNodes.cpp b/zeno/src/nodes/CameraNodes.cpp
index e8694880d9..7ca8ee3f40 100644
--- a/zeno/src/nodes/CameraNodes.cpp
+++ b/zeno/src/nodes/CameraNodes.cpp
@@ -58,6 +58,8 @@ struct SetPhysicalCamera : INode {
ud.set2("iso", get_input2("iso"));
ud.set2("aces", get_input2("aces"));
ud.set2("exposure", get_input2("exposure"));
+ ud.set2("panorama_camera", get_input2("panorama_camera"));
+ ud.set2("panorama_hemisphere", get_input2("panorama_hemisphere"));
set_output("camera", std::move(camera));
}
@@ -71,6 +73,9 @@ ZENO_DEFNODE(SetPhysicalCamera)({
{"float", "iso", "150"},
{"bool", "aces", "0"},
{"bool", "exposure", "0"},
+ {"bool", "exposure", "0"},
+ {"bool", "panorama_camera", "0"},
+ {"bool", "panorama_hemisphere", "0"},
},
{
{"CameraObject", "camera"},
diff --git a/zenovis/include/zenovis/Camera.h b/zenovis/include/zenovis/Camera.h
index 00126d5de2..fe38e5181c 100644
--- a/zenovis/include/zenovis/Camera.h
+++ b/zenovis/include/zenovis/Camera.h
@@ -17,6 +17,8 @@ struct ZOptixCameraSettingInfo {
float iso = 150;
bool aces = false;
bool exposure = false;
+ bool panorama_camera = false;
+ bool panorama_hemisphere = false;
};
struct Camera {
@@ -75,7 +77,7 @@ struct Camera {
float get_safe_frames() const;
bool is_locked_window() const;
void setCamera(zeno::CameraData const &cam);
- void setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure);
+ void setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere);
void placeCamera(glm::vec3 pos, glm::vec3 front, glm::vec3 up);
void lookCamera(float cx, float cy, float cz, float theta, float phi, float radius, bool ortho_mode, float fov, float aperture, float focalPlaneDistance);
void focusCamera(float cx, float cy, float cz, float radius);
diff --git a/zenovis/src/Camera.cpp b/zenovis/src/Camera.cpp
index aca4d46924..fd76a6ecd4 100644
--- a/zenovis/src/Camera.cpp
+++ b/zenovis/src/Camera.cpp
@@ -52,12 +52,14 @@ void Camera::setCamera(zeno::CameraData const &cam) {
this->m_need_sync = true;
}
-void Camera::setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure) {
+void Camera::setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere) {
this->zOptixCameraSettingInfo.aperture = aperture;
this->zOptixCameraSettingInfo.shutter_speed = shutter_speed;
this->zOptixCameraSettingInfo.iso = iso;
this->zOptixCameraSettingInfo.aces = aces;
this->zOptixCameraSettingInfo.exposure = exposure;
+ this->zOptixCameraSettingInfo.panorama_camera = panorama_camera;
+ this->zOptixCameraSettingInfo.panorama_hemisphere = panorama_hemisphere;
}
static glm::mat4 MakeInfReversedZProjRH(float fovY_radians, float aspectWbyH, float zNear) {
diff --git a/zenovis/src/optx/RenderEngineOptx.cpp b/zenovis/src/optx/RenderEngineOptx.cpp
index 23df143dda..1f0827e572 100644
--- a/zenovis/src/optx/RenderEngineOptx.cpp
+++ b/zenovis/src/optx/RenderEngineOptx.cpp
@@ -781,7 +781,9 @@ struct GraphicsManager {
ud.get2("shutter_speed"),
ud.get2("iso"),
ud.get2("aces"),
- ud.get2("exposure")
+ ud.get2("exposure"),
+ ud.get2("panorama_camera"),
+ ud.get2("panorama_hemisphere")
);
}
}
@@ -821,7 +823,9 @@ struct GraphicsManager {
ud.get2("shutter_speed"),
ud.get2("iso"),
ud.get2("aces"),
- ud.get2("exposure")
+ ud.get2("exposure"),
+ ud.get2("panorama_camera"),
+ ud.get2("panorama_hemisphere")
);
}
}
@@ -1063,7 +1067,9 @@ struct RenderEngineOptx : RenderEngine, zeno::disable_copy {
cam.zOptixCameraSettingInfo.shutter_speed,
cam.zOptixCameraSettingInfo.iso,
cam.zOptixCameraSettingInfo.aces,
- cam.zOptixCameraSettingInfo.exposure
+ cam.zOptixCameraSettingInfo.exposure,
+ cam.zOptixCameraSettingInfo.panorama_camera,
+ cam.zOptixCameraSettingInfo.panorama_hemisphere
);
}
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index ed0214b030..4dc5882d3a 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -199,11 +199,9 @@ extern "C" __global__ void __raygen__rg()
float3 ray_origin = eye_shake;
float3 ray_direction = terminal_point - eye_shake;
ray_direction = normalize(ray_direction);
- int panorama = 1;
- int hemisphere = 1;
- if (panorama) {
+ if (params.physical_camera_panorama_camera) {
float phi = (float(idx.x) + subpixel_jitter.x) / float(w) * 2.0f * M_PIf;
- if (hemisphere) {
+ if (params.physical_camera_panorama_hemisphere) {
phi = ((float(idx.x) + subpixel_jitter.x) / float(w) + 0.5f) * M_PIf;
}
float theta = (float(idx.y) + subpixel_jitter.y) / float(h) * M_PIf;
diff --git a/zenovis/xinxinoptix/optixPathTracer.cpp b/zenovis/xinxinoptix/optixPathTracer.cpp
index 9a81fac636..40680ff19a 100644
--- a/zenovis/xinxinoptix/optixPathTracer.cpp
+++ b/zenovis/xinxinoptix/optixPathTracer.cpp
@@ -3696,12 +3696,14 @@ void set_window_size(int nx, int ny) {
resize_dirty = true;
}
-void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure) {
+void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere) {
state.params.physical_camera_aperture = aperture;
state.params.physical_camera_shutter_speed = shutter_speed;
state.params.physical_camera_iso = iso;
state.params.physical_camera_aces = aces;
state.params.physical_camera_exposure = exposure;
+ state.params.physical_camera_panorama_camera = panorama_camera;
+ state.params.physical_camera_panorama_hemisphere = panorama_hemisphere;
}
void set_perspective(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, float fpd, float aperture) {
set_perspective_by_fov(U,V,W,E,aspect,fov,0,0.024f,fpd,aperture,0.0f,0.0f,0.0f,0.0f);
diff --git a/zenovis/xinxinoptix/optixPathTracer.h b/zenovis/xinxinoptix/optixPathTracer.h
index d26f167511..db9b8c3a67 100644
--- a/zenovis/xinxinoptix/optixPathTracer.h
+++ b/zenovis/xinxinoptix/optixPathTracer.h
@@ -254,6 +254,8 @@ struct Params
float physical_camera_iso;
bool physical_camera_aces;
bool physical_camera_exposure;
+ bool physical_camera_panorama_camera;
+ bool physical_camera_panorama_hemisphere;
};
diff --git a/zenovis/xinxinoptix/xinxinoptixapi.h b/zenovis/xinxinoptix/xinxinoptixapi.h
index 826145e270..47600ccf39 100644
--- a/zenovis/xinxinoptix/xinxinoptixapi.h
+++ b/zenovis/xinxinoptix/xinxinoptixapi.h
@@ -54,7 +54,7 @@ void optixupdateend();
void set_window_size(int nx, int ny);
void set_outside_random_number(int32_t outside_random_number);
void set_perspective(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, float fpd, float aperture);
-void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure);
+void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere);
void set_perspective_by_fov(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, int fov_type, float L, float focal_distance, float aperture, float pitch, float yaw, float h_shift, float v_shift);
void set_perspective_by_focal_length(float const *U, float const *V, float const *W, float const *E, float aspect, float focal_length, float w, float h, float focal_distance, float aperture, float pitch, float yaw, float h_shift, float v_shift);
void load_object(std::string const &key, std::string const &mtlid, const std::string& instID, float const *verts, size_t numverts, int const *tris, size_t numtris, std::map> const &vtab,int const *matids, std::vector const &matNameList);
From bb963c983386a528280def74bf7e028760940a52 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Fri, 12 Apr 2024 18:56:24 +0800
Subject: [PATCH 3/7] ray_origin
---
zenovis/xinxinoptix/PTKernel.cu | 1 +
1 file changed, 1 insertion(+)
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index 4dc5882d3a..6bd15d3d03 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -200,6 +200,7 @@ extern "C" __global__ void __raygen__rg()
float3 ray_direction = terminal_point - eye_shake;
ray_direction = normalize(ray_direction);
if (params.physical_camera_panorama_camera) {
+ float3 ray_origin = make_float3(0.0f, 0.0f, 0.0f);
float phi = (float(idx.x) + subpixel_jitter.x) / float(w) * 2.0f * M_PIf;
if (params.physical_camera_panorama_hemisphere) {
phi = ((float(idx.x) + subpixel_jitter.x) / float(w) + 0.5f) * M_PIf;
From be6fa1ec7775fa95e542ad33ea81515fe923bff1 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Fri, 12 Apr 2024 23:58:23 +0800
Subject: [PATCH 4/7] vr180
---
zenovis/xinxinoptix/PTKernel.cu | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index 6bd15d3d03..ede80e4f38 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -200,21 +200,28 @@ extern "C" __global__ void __raygen__rg()
float3 ray_direction = terminal_point - eye_shake;
ray_direction = normalize(ray_direction);
if (params.physical_camera_panorama_camera) {
- float3 ray_origin = make_float3(0.0f, 0.0f, 0.0f);
+ ray_origin = make_float3(0.0f, 0.0f, 0.0f);
float phi = (float(idx.x) + subpixel_jitter.x) / float(w) * 2.0f * M_PIf;
+ mat3 camera_transform = mat3(
+ cam.right.x, cam.up.x, -cam.front.x,
+ cam.right.y, cam.up.y, -cam.front.y,
+ cam.right.z, cam.up.z, -cam.front.z
+ );
if (params.physical_camera_panorama_hemisphere) {
- phi = ((float(idx.x) + subpixel_jitter.x) / float(w) + 0.5f) * M_PIf;
+ int idxx = idx.x >= w/2? idx.x - w/2 : idx.x;
+ phi = ((float(idxx) + subpixel_jitter.x) / float(w / 2) + 0.5f) * M_PIf;
+ if (idx.x < w / 2) {
+ ray_origin = camera_transform * make_float3(-0.03f, 0.0f, 0.0f);
+ }
+ else {
+ ray_origin = camera_transform * make_float3(0.03f, 0.0f, 0.0f);
+ }
}
float theta = (float(idx.y) + subpixel_jitter.y) / float(h) * M_PIf;
float y = -cosf(theta);
float z = sinf(theta) * cosf(phi);
float x = sinf(theta) * sinf(-phi);
- mat3 camera_transform = mat3(
- cam.right.x, cam.up.x, -cam.front.x,
- cam.right.y, cam.up.y, -cam.front.y,
- cam.right.z, cam.up.z, -cam.front.z
- );
ray_direction = camera_transform * make_float3(x, y, z);
}
From 1df1ac8b1ffaab3833cc957a7e138838ee1bbcc0 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Sat, 13 Apr 2024 00:30:32 +0800
Subject: [PATCH 5/7] vr180 ui
---
ui/zenoedit/dialog/ZOptixCameraSetting.cpp | 22 ++++++++++++++++------
ui/zenoedit/viewport/optixviewport.cpp | 9 ++++++---
ui/zenoedit/viewport/optixviewport.h | 4 ++--
zeno/src/nodes/CameraNodes.cpp | 6 ++++--
zenovis/include/zenovis/Camera.h | 5 +++--
zenovis/src/Camera.cpp | 5 +++--
zenovis/src/optx/RenderEngineOptx.cpp | 9 ++++++---
zenovis/xinxinoptix/PTKernel.cu | 6 +++---
zenovis/xinxinoptix/optixPathTracer.cpp | 5 +++--
zenovis/xinxinoptix/optixPathTracer.h | 3 ++-
zenovis/xinxinoptix/xinxinoptixapi.h | 2 +-
11 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/ui/zenoedit/dialog/ZOptixCameraSetting.cpp b/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
index a14609fb40..d42f83f12e 100644
--- a/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
+++ b/ui/zenoedit/dialog/ZOptixCameraSetting.cpp
@@ -48,9 +48,14 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
m_panorama_camera->setStyleSheet("color: white;");
m_panorama_camera->setChecked(info.panorama_camera);
- QCheckBox *m_panorama_hemisphere = new QCheckBox(tr("PanoramaHemisphere"));
- m_panorama_hemisphere->setStyleSheet("color: white;");
- m_panorama_hemisphere->setChecked(info.panorama_hemisphere);
+ QCheckBox *m_panorama_vr180 = new QCheckBox(tr("PanoramaVR180"));
+ m_panorama_vr180->setStyleSheet("color: white;");
+ m_panorama_vr180->setChecked(info.panorama_vr180);
+
+ QDoubleSpinBox* m_pupillary_distance = new QDoubleSpinBox();
+ m_pupillary_distance->setDecimals(3);
+ m_pupillary_distance->setRange(0.0, 10000);
+ m_pupillary_distance->setValue(info.pupillary_distance);
mainLayout->addWidget(new QLabel("Aperture"));
mainLayout->addWidget(m_aperture);
@@ -61,7 +66,9 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
mainLayout->addWidget(m_aces);
mainLayout->addWidget(m_exposure);
mainLayout->addWidget(m_panorama_camera);
- mainLayout->addWidget(m_panorama_hemisphere);
+ mainLayout->addWidget(m_panorama_vr180);
+ mainLayout->addWidget(new QLabel("PupillaryDistance"));
+ mainLayout->addWidget(m_pupillary_distance);
mainLayout->addLayout(buttonLayout);
@@ -91,8 +98,11 @@ ZOptixCameraSetting::ZOptixCameraSetting(zenovis::ZOptixCameraSettingInfo &info,
connect(m_panorama_camera, &QCheckBox::stateChanged, this, [&](int state) {
info.panorama_camera = state == Qt::Checked;
});
- connect(m_panorama_hemisphere, &QCheckBox::stateChanged, this, [&](int state) {
- info.panorama_hemisphere = state == Qt::Checked;
+ connect(m_panorama_vr180, &QCheckBox::stateChanged, this, [&](int state) {
+ info.panorama_vr180 = state == Qt::Checked;
+ });
+ connect(m_pupillary_distance, QOverload::of(&QDoubleSpinBox::valueChanged), this, [&](double value) {
+ info.pupillary_distance = value;
});
}
diff --git a/ui/zenoedit/viewport/optixviewport.cpp b/ui/zenoedit/viewport/optixviewport.cpp
index 726dde82b4..cd192505c5 100644
--- a/ui/zenoedit/viewport/optixviewport.cpp
+++ b/ui/zenoedit/viewport/optixviewport.cpp
@@ -353,7 +353,8 @@ void OptixWorker::onSetData(
bool aces,
bool exposure,
bool panorama_camera,
- bool panorama_hemisphere
+ bool panorama_vr180,
+ float pupillary_distance
) {
// zeno::log_info("I am in optix thread, now I want to set value {}", iso);
auto scene = m_zenoVis->getSession()->get_scene();
@@ -363,7 +364,8 @@ void OptixWorker::onSetData(
scene->camera->zOptixCameraSettingInfo.aces = aces;
scene->camera->zOptixCameraSettingInfo.exposure = exposure;
scene->camera->zOptixCameraSettingInfo.panorama_camera = panorama_camera;
- scene->camera->zOptixCameraSettingInfo.panorama_hemisphere = panorama_hemisphere;
+ scene->camera->zOptixCameraSettingInfo.panorama_vr180 = panorama_vr180;
+ scene->camera->zOptixCameraSettingInfo.pupillary_distance = pupillary_distance;
scene->drawOptions->needRefresh = true;
}
@@ -460,7 +462,8 @@ void ZOptixViewport::setdata_on_optix_thread(zenovis::ZOptixCameraSettingInfo va
value.aces,
value.exposure,
value.panorama_camera,
- value.panorama_hemisphere
+ value.panorama_vr180,
+ value.pupillary_distance
);
}
diff --git a/ui/zenoedit/viewport/optixviewport.h b/ui/zenoedit/viewport/optixviewport.h
index debc0b4680..71672cd701 100644
--- a/ui/zenoedit/viewport/optixviewport.h
+++ b/ui/zenoedit/viewport/optixviewport.h
@@ -44,7 +44,7 @@ public slots:
void onCleanUpScene();
void onSetBackground(bool bShowBg);
- void onSetData(float, float, float, bool, bool, bool, bool);
+ void onSetData(float, float, float, bool, bool, bool, bool, float);
private:
Zenovis *m_zenoVis;
@@ -108,7 +108,7 @@ class ZOptixViewport : public QWidget
void sig_updateCameraProp(float aperture, float disPlane, UI_VECTYPE skipParam = UI_VECTYPE());
void sig_cleanUpScene();
void sig_setBackground(bool bShowBg);
- void sig_setdata_on_optix_thread(float, float, float, bool, bool, bool, bool);
+ void sig_setdata_on_optix_thread(float, float, float, bool, bool, bool, bool, float);
public slots:
void onFrameRunFinished(int frame);
diff --git a/zeno/src/nodes/CameraNodes.cpp b/zeno/src/nodes/CameraNodes.cpp
index 7ca8ee3f40..cf700e13b9 100644
--- a/zeno/src/nodes/CameraNodes.cpp
+++ b/zeno/src/nodes/CameraNodes.cpp
@@ -59,7 +59,8 @@ struct SetPhysicalCamera : INode {
ud.set2("aces", get_input2("aces"));
ud.set2("exposure", get_input2("exposure"));
ud.set2("panorama_camera", get_input2("panorama_camera"));
- ud.set2("panorama_hemisphere", get_input2("panorama_hemisphere"));
+ ud.set2("panorama_vr180", get_input2("panorama_vr180"));
+ ud.set2("pupillary_distance", get_input2("pupillary_distance"));
set_output("camera", std::move(camera));
}
@@ -75,7 +76,8 @@ ZENO_DEFNODE(SetPhysicalCamera)({
{"bool", "exposure", "0"},
{"bool", "exposure", "0"},
{"bool", "panorama_camera", "0"},
- {"bool", "panorama_hemisphere", "0"},
+ {"bool", "panorama_vr180", "0"},
+ {"float", "pupillary_distance", "0.06"},
},
{
{"CameraObject", "camera"},
diff --git a/zenovis/include/zenovis/Camera.h b/zenovis/include/zenovis/Camera.h
index fe38e5181c..1249175294 100644
--- a/zenovis/include/zenovis/Camera.h
+++ b/zenovis/include/zenovis/Camera.h
@@ -18,7 +18,8 @@ struct ZOptixCameraSettingInfo {
bool aces = false;
bool exposure = false;
bool panorama_camera = false;
- bool panorama_hemisphere = false;
+ bool panorama_vr180 = false;
+ float pupillary_distance = 0.06;
};
struct Camera {
@@ -77,7 +78,7 @@ struct Camera {
float get_safe_frames() const;
bool is_locked_window() const;
void setCamera(zeno::CameraData const &cam);
- void setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere);
+ void setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_vr180, float pupillary_distance);
void placeCamera(glm::vec3 pos, glm::vec3 front, glm::vec3 up);
void lookCamera(float cx, float cy, float cz, float theta, float phi, float radius, bool ortho_mode, float fov, float aperture, float focalPlaneDistance);
void focusCamera(float cx, float cy, float cz, float radius);
diff --git a/zenovis/src/Camera.cpp b/zenovis/src/Camera.cpp
index fd76a6ecd4..e5ca2178b4 100644
--- a/zenovis/src/Camera.cpp
+++ b/zenovis/src/Camera.cpp
@@ -52,14 +52,15 @@ void Camera::setCamera(zeno::CameraData const &cam) {
this->m_need_sync = true;
}
-void Camera::setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere) {
+void Camera::setPhysicalCamera(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_vr180, float pupillary_distance) {
this->zOptixCameraSettingInfo.aperture = aperture;
this->zOptixCameraSettingInfo.shutter_speed = shutter_speed;
this->zOptixCameraSettingInfo.iso = iso;
this->zOptixCameraSettingInfo.aces = aces;
this->zOptixCameraSettingInfo.exposure = exposure;
this->zOptixCameraSettingInfo.panorama_camera = panorama_camera;
- this->zOptixCameraSettingInfo.panorama_hemisphere = panorama_hemisphere;
+ this->zOptixCameraSettingInfo.panorama_vr180 = panorama_vr180;
+ this->zOptixCameraSettingInfo.pupillary_distance = pupillary_distance;
}
static glm::mat4 MakeInfReversedZProjRH(float fovY_radians, float aspectWbyH, float zNear) {
diff --git a/zenovis/src/optx/RenderEngineOptx.cpp b/zenovis/src/optx/RenderEngineOptx.cpp
index 1f0827e572..d65cce7667 100644
--- a/zenovis/src/optx/RenderEngineOptx.cpp
+++ b/zenovis/src/optx/RenderEngineOptx.cpp
@@ -783,7 +783,8 @@ struct GraphicsManager {
ud.get2("aces"),
ud.get2("exposure"),
ud.get2("panorama_camera"),
- ud.get2("panorama_hemisphere")
+ ud.get2("panorama_vr180"),
+ ud.get2("pupillary_distance")
);
}
}
@@ -825,7 +826,8 @@ struct GraphicsManager {
ud.get2("aces"),
ud.get2("exposure"),
ud.get2("panorama_camera"),
- ud.get2("panorama_hemisphere")
+ ud.get2("panorama_vr180"),
+ ud.get2("pupillary_distance")
);
}
}
@@ -1069,7 +1071,8 @@ struct RenderEngineOptx : RenderEngine, zeno::disable_copy {
cam.zOptixCameraSettingInfo.aces,
cam.zOptixCameraSettingInfo.exposure,
cam.zOptixCameraSettingInfo.panorama_camera,
- cam.zOptixCameraSettingInfo.panorama_hemisphere
+ cam.zOptixCameraSettingInfo.panorama_vr180,
+ cam.zOptixCameraSettingInfo.pupillary_distance
);
}
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index ede80e4f38..f884ba3de1 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -207,14 +207,14 @@ extern "C" __global__ void __raygen__rg()
cam.right.y, cam.up.y, -cam.front.y,
cam.right.z, cam.up.z, -cam.front.z
);
- if (params.physical_camera_panorama_hemisphere) {
+ if (params.physical_camera_panorama_vr180) {
int idxx = idx.x >= w/2? idx.x - w/2 : idx.x;
phi = ((float(idxx) + subpixel_jitter.x) / float(w / 2) + 0.5f) * M_PIf;
if (idx.x < w / 2) {
- ray_origin = camera_transform * make_float3(-0.03f, 0.0f, 0.0f);
+ ray_origin = camera_transform * make_float3(-params.physical_camera_pupillary_distance, 0.0f, 0.0f);
}
else {
- ray_origin = camera_transform * make_float3(0.03f, 0.0f, 0.0f);
+ ray_origin = camera_transform * make_float3(params.physical_camera_pupillary_distance, 0.0f, 0.0f);
}
}
float theta = (float(idx.y) + subpixel_jitter.y) / float(h) * M_PIf;
diff --git a/zenovis/xinxinoptix/optixPathTracer.cpp b/zenovis/xinxinoptix/optixPathTracer.cpp
index 40680ff19a..f32797a5d2 100644
--- a/zenovis/xinxinoptix/optixPathTracer.cpp
+++ b/zenovis/xinxinoptix/optixPathTracer.cpp
@@ -3696,14 +3696,15 @@ void set_window_size(int nx, int ny) {
resize_dirty = true;
}
-void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere) {
+void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_vr180, float pupillary_distance) {
state.params.physical_camera_aperture = aperture;
state.params.physical_camera_shutter_speed = shutter_speed;
state.params.physical_camera_iso = iso;
state.params.physical_camera_aces = aces;
state.params.physical_camera_exposure = exposure;
state.params.physical_camera_panorama_camera = panorama_camera;
- state.params.physical_camera_panorama_hemisphere = panorama_hemisphere;
+ state.params.physical_camera_panorama_vr180 = panorama_vr180;
+ state.params.physical_camera_pupillary_distance = pupillary_distance;
}
void set_perspective(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, float fpd, float aperture) {
set_perspective_by_fov(U,V,W,E,aspect,fov,0,0.024f,fpd,aperture,0.0f,0.0f,0.0f,0.0f);
diff --git a/zenovis/xinxinoptix/optixPathTracer.h b/zenovis/xinxinoptix/optixPathTracer.h
index db9b8c3a67..1f1714ec57 100644
--- a/zenovis/xinxinoptix/optixPathTracer.h
+++ b/zenovis/xinxinoptix/optixPathTracer.h
@@ -255,7 +255,8 @@ struct Params
bool physical_camera_aces;
bool physical_camera_exposure;
bool physical_camera_panorama_camera;
- bool physical_camera_panorama_hemisphere;
+ bool physical_camera_panorama_vr180;
+ float physical_camera_pupillary_distance;
};
diff --git a/zenovis/xinxinoptix/xinxinoptixapi.h b/zenovis/xinxinoptix/xinxinoptixapi.h
index 47600ccf39..b37b55f2fd 100644
--- a/zenovis/xinxinoptix/xinxinoptixapi.h
+++ b/zenovis/xinxinoptix/xinxinoptixapi.h
@@ -54,7 +54,7 @@ void optixupdateend();
void set_window_size(int nx, int ny);
void set_outside_random_number(int32_t outside_random_number);
void set_perspective(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, float fpd, float aperture);
-void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_hemisphere);
+void set_physical_camera_param(float aperture, float shutter_speed, float iso, bool aces, bool exposure, bool panorama_camera, bool panorama_vr180, float pupillary_distance);
void set_perspective_by_fov(float const *U, float const *V, float const *W, float const *E, float aspect, float fov, int fov_type, float L, float focal_distance, float aperture, float pitch, float yaw, float h_shift, float v_shift);
void set_perspective_by_focal_length(float const *U, float const *V, float const *W, float const *E, float aspect, float focal_length, float w, float h, float focal_distance, float aperture, float pitch, float yaw, float h_shift, float v_shift);
void load_object(std::string const &key, std::string const &mtlid, const std::string& instID, float const *verts, size_t numverts, int const *tris, size_t numtris, std::map> const &vtab,int const *matids, std::vector const &matNameList);
From 35f29416b86bf8d80f777f9b835c7adf8b88d223 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Sun, 14 Apr 2024 02:07:55 +0800
Subject: [PATCH 6/7] fix
---
zenovis/xinxinoptix/PTKernel.cu | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/zenovis/xinxinoptix/PTKernel.cu b/zenovis/xinxinoptix/PTKernel.cu
index f884ba3de1..e8ba24a947 100644
--- a/zenovis/xinxinoptix/PTKernel.cu
+++ b/zenovis/xinxinoptix/PTKernel.cu
@@ -211,10 +211,10 @@ extern "C" __global__ void __raygen__rg()
int idxx = idx.x >= w/2? idx.x - w/2 : idx.x;
phi = ((float(idxx) + subpixel_jitter.x) / float(w / 2) + 0.5f) * M_PIf;
if (idx.x < w / 2) {
- ray_origin = camera_transform * make_float3(-params.physical_camera_pupillary_distance, 0.0f, 0.0f);
+ ray_origin = camera_transform * make_float3(-params.physical_camera_pupillary_distance / 2.0f, 0.0f, 0.0f);
}
else {
- ray_origin = camera_transform * make_float3(params.physical_camera_pupillary_distance, 0.0f, 0.0f);
+ ray_origin = camera_transform * make_float3(params.physical_camera_pupillary_distance / 2.0f, 0.0f, 0.0f);
}
}
float theta = (float(idx.y) + subpixel_jitter.y) / float(h) * M_PIf;
From 477e9e4a1ae07124c37ba738875463cfdfe52e37 Mon Sep 17 00:00:00 2001
From: zhouhang95 <765229842@qq.com>
Date: Sun, 28 Apr 2024 18:38:58 +0800
Subject: [PATCH 7/7] fix ui
---
ui/zenoedit/dialog/zrecorddlg.ui | 20 --------------------
1 file changed, 20 deletions(-)
diff --git a/ui/zenoedit/dialog/zrecorddlg.ui b/ui/zenoedit/dialog/zrecorddlg.ui
index 7b27864e41..71c3a8ed68 100644
--- a/ui/zenoedit/dialog/zrecorddlg.ui
+++ b/ui/zenoedit/dialog/zrecorddlg.ui
@@ -180,26 +180,6 @@
- -
-
-
- PanoramaCamera
-
-
- false
-
-
-
- -
-
-
- Hemisphere
-
-
- false
-
-
-
-