renderingbranch
This commit is contained in:
@@ -10,6 +10,9 @@
|
||||
#include "../util/grid/grid3eigen.hpp"
|
||||
#include "../util/output/frame.hpp"
|
||||
#include "../util/output/bmpwriter.hpp"
|
||||
#include "../util/output/aviwriter.hpp"
|
||||
#include "../util/timing_decorator.hpp"
|
||||
#include "../util/timing_decorator.cpp"
|
||||
|
||||
// Helper function to create a solid volume of voxels with material properties
|
||||
void createBox(Octree<int>& octree, const Eigen::Vector3f& center, const Eigen::Vector3f& size,
|
||||
@@ -123,11 +126,16 @@ int main() {
|
||||
octree.generateLODs();
|
||||
octree.printStats();
|
||||
|
||||
// 3. Setup rendering loop
|
||||
// 3. Setup video rendering
|
||||
int width = 512;
|
||||
int height = 512;
|
||||
int samples = 400;
|
||||
int bounces = 5;
|
||||
|
||||
// --- Video Animation Parameters ---
|
||||
const float fps = 30.0f;
|
||||
const float durationPerSegment = 10.0f; // Seconds to travel between each view
|
||||
const int framesPerSegment = static_cast<int>(fps * durationPerSegment);
|
||||
const int video_samples = 100; // Samples per pixel for each video frame
|
||||
const int video_bounces = 5; // Ray bounces for each video frame
|
||||
|
||||
struct View {
|
||||
std::string name;
|
||||
@@ -135,61 +143,65 @@ int main() {
|
||||
Eigen::Vector3f up;
|
||||
};
|
||||
|
||||
// The walls are set perfectly at +/- 7.0 inner edges.
|
||||
// Placing camera at +/- 6.8 will put it "just barely inside".
|
||||
// Floor is at Z = -0.5, Wall top is at Z = 7.5
|
||||
// Define the keyframe camera views for the animation
|
||||
std::vector<View> views = {
|
||||
{"+X", Eigen::Vector3f( 6.8f, 0.0f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"-X", Eigen::Vector3f(-6.8f, 0.0f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"+Y", Eigen::Vector3f( 0.0f, 6.8f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"-Y", Eigen::Vector3f( 0.0f, -6.8f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"+Z", Eigen::Vector3f( 0.0f, 0.0f, 7.3f), Eigen::Vector3f(0.0f, 1.0f, 0.0f)} // Looking down from just beneath wall top
|
||||
{"+X", Eigen::Vector3f( 6.8f, 0.0f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"+Y", Eigen::Vector3f( 0.0f, 6.8f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"-X", Eigen::Vector3f(-6.8f, 0.0f, 1.0f), Eigen::Vector3f(0.0f, 0.0f, 1.0f)},
|
||||
{"+Z", Eigen::Vector3f( 0.0f, 0.0f, 7.3f), Eigen::Vector3f(0.0f, 1.0f, 0.0f)} // Top-down view
|
||||
};
|
||||
|
||||
Eigen::Vector3f target(0.0f, 0.0f, 0.5f);
|
||||
Eigen::Vector3f target(0.0f, 0.0f, 0.5f); // The camera will always look at this point
|
||||
|
||||
for (const auto& view : views) {
|
||||
std::cout << "\nRendering view from " << view.name << " direction (Fast Pass)..." << std::endl;
|
||||
|
||||
Camera cam;
|
||||
cam.origin = view.origin;
|
||||
cam.direction = (target - view.origin).normalized();
|
||||
cam.up = view.up;
|
||||
|
||||
frame out = octree.fastRenderFrame(cam, height, width, frame::colormap::RGB);
|
||||
|
||||
std::string filename = "output/fast/render_" + view.name + ".bmp";
|
||||
BMPWriter::saveBMP(filename, out);
|
||||
}
|
||||
|
||||
for (const auto& view : views) {
|
||||
std::cout << "\nRendering view from " << view.name << " direction (Medium 60s Pass)..." << std::endl;
|
||||
|
||||
Camera cam;
|
||||
cam.origin = view.origin;
|
||||
cam.direction = (target - view.origin).normalized();
|
||||
cam.up = view.up;
|
||||
|
||||
frame out = octree.renderFrameTimed(cam, height, width, frame::colormap::RGB, 60, bounces, false, true);
|
||||
|
||||
std::string filename = "output/medium/render_" + view.name + ".bmp";
|
||||
BMPWriter::saveBMP(filename, out);
|
||||
}
|
||||
|
||||
for (const auto& view : views) {
|
||||
std::cout << "\nRendering view from " << view.name << " direction (Slow 400 Samples Pass)..." << std::endl;
|
||||
|
||||
Camera cam;
|
||||
cam.origin = view.origin;
|
||||
cam.direction = (target - view.origin).normalized();
|
||||
cam.up = view.up;
|
||||
|
||||
frame out = octree.renderFrame(cam, height, width, frame::colormap::RGB, samples, bounces, false, true);
|
||||
|
||||
std::string filename = "output/slow/render_" + view.name + ".bmp";
|
||||
BMPWriter::saveBMP(filename, out);
|
||||
// --- Main Animation and Rendering Loop ---
|
||||
std::vector<frame> videoFrames;
|
||||
const int totalFrames = framesPerSegment * views.size();
|
||||
videoFrames.reserve(totalFrames);
|
||||
int frameCounter = 0;
|
||||
|
||||
std::cout << "\nStarting video render..." << std::endl;
|
||||
std::cout << "Total frames to render: " << totalFrames << std::endl;
|
||||
|
||||
for (size_t i = 0; i < views.size(); ++i) {
|
||||
const View& startView = views[i];
|
||||
const View& endView = views[(i + 1) % views.size()]; // Loop back to the first view at the end
|
||||
|
||||
std::cout << "\nAnimating segment: " << startView.name << " -> " << endView.name << std::endl;
|
||||
|
||||
for (int j = 0; j < framesPerSegment; ++j) {
|
||||
frameCounter++;
|
||||
float t = static_cast<float>(j) / static_cast<float>(framesPerSegment);
|
||||
|
||||
// Interpolate camera position (origin) linearly
|
||||
Eigen::Vector3f currentOrigin = startView.origin * (1.0f - t) + endView.origin * t;
|
||||
|
||||
// Interpolate camera orientation (up vector) and normalize
|
||||
Eigen::Vector3f currentUp = (startView.up * (1.0f - t) + endView.up * t).normalized();
|
||||
|
||||
Camera cam;
|
||||
cam.origin = currentOrigin;
|
||||
cam.up = currentUp;
|
||||
cam.direction = (target - cam.origin).normalized();
|
||||
|
||||
std::cout << "Rendering video frame " << frameCounter << "/" << totalFrames << "..." << std::endl;
|
||||
|
||||
frame out = octree.renderFrame(cam, height, width, frame::colormap::RGB, video_samples, video_bounces, false, true);
|
||||
|
||||
videoFrames.push_back(std::move(out)); // Use std::move for efficiency
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "\nAll renders complete!" << std::endl;
|
||||
// --- Save the final video ---
|
||||
std::cout << "\nAll frames rendered. Saving video file..." << std::endl;
|
||||
std::string videoFilename = "output/material_test_video.avi";
|
||||
|
||||
if (AVIWriter::saveAVIFromCompressedFrames(videoFilename, std::move(videoFrames), width, height, fps)) {
|
||||
std::cout << "Video saved successfully to " << videoFilename << std::endl;
|
||||
} else {
|
||||
std::cerr << "Error: Failed to save video!" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "\nRender complete!" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user