C ++ Raytracer — только один объект появляется в сцене

Я использую raytracer для рендеринга Sphereflake, но у меня возникают проблемы с попыткой появления на сцене большего, чем объект. В приведенной ниже сцене я просто пытаюсь проверить наличие двух сфер в сцене, но по какой-то причине в сцене появляется только одна сфера, и обычно это сфера с наибольшим радиусом.

Еще одна странная вещь: несмотря на то, что в сцене установлена ​​камера, кажется, что окно вывода всегда показывает преобладающий объект в центре ((0,0) с координатами экрана между [-1, -1] -> [1,1]), а не в соответствии с пространством координат камеры.

Я не уверен, если это проблема родительской иерархии или как я рендеринг объектов, но любое понимание того, почему проблема сохраняется, будет принята с благодарностью.

main.cpp (создает сцены, визуализирует объекты)

#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <glm.hpp>
#include <gtc/matrix_transform.hpp>

#include <Raytracer/Raytracer.h>

using namespace glm;
using namespace Raytracer;
using namespace Raytracer::Scenes;
using namespace Raytracer::Objects;

/**
* Places a few spheres in the scene and adds some lights.
*
* @param scene The scene
*/
Scene *BuildScene(int depth, float aspect)
{
const int materialCount = 6;

vec3 colors[materialCount] =
{
vec3(1.0f, 0.0f, 0.0f),
vec3(1.0f, 1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f),
vec3(0.0f, 1.0f, 1.0f),
vec3(0.0f, 0.0f, 1.0f),
vec3(1.0f, 0.0f, 1.0f)
};

Material *materials[materialCount];

for (int i = 0; i < materialCount; i++)
{
materials[i] = new Material();
if (materials[i] == NULL)
return NULL;

vec3 ambient = colors[i] * 0.01f;
materials[i]->SetAmbient(ambient);
materials[i]->SetDiffuse(colors[i]);
materials[i]->SetShininess(25.0f);
}

if (depth <= 0)
return NULL;

// Create the scene.
Scene *scene = new Scene();
if (scene == NULL)
return NULL;

Sphere * s1 = new Sphere(0.33f, materials[5]);
s1->SetPosition(vec3(5.0f, 0.0f, -2.0f));
Sphere * s2 = new Sphere(0.33f, materials[1]);
s2->SetPosition(vec3((5.0f, 0.33f, -2.0f));

s1->AddChild(s2);

// Create a light.
Light *light = new PointLight(vec3(10.0f));
if (light == NULL)
{
delete scene;
return NULL;
}

light->SetPosition(vec3(-5.0f, 3.0f, 2.0f));
scene->AddChild(light);

// Create a camera.
Camera *camera = new Camera(vec3(-2.0f, 2.0f, 4.0f), vec3(0.0f, 0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), Camera::DefaultFov, aspect);

scene->AddChild(s1);

if (camera == NULL)
{
delete scene;
return NULL;
}
scene->AddChild(camera);
scene->SetActiveCamera(camera);

return scene;
}

/**
* Renders the scene and saves the result to a BMP file.
*
* @param fileName The name of the file
* @param width The image width
* @param height The image height
*/
void Render(const char *fileName, int width, int height)
{
if (fileName == NULL || width <= 0 || height <= 0)
return;

SimpleRenderer renderer;

renderer.SetAccelerator(new SimpleAccelerator());
renderer.SetIntegrator(new PhongIntegrator());

puts("Generiere Szene...");
Scene *scene = BuildScene(3, (float)width / height);
if (scene == NULL)
return;

puts("Rendere Bild...");
Image *image = renderer.Render(*scene, width, height);
if (image != NULL)
{
puts("Speichere Ergebnis...");
image->SaveBMP(fileName, 2.2f);
delete image;
}

delete scene;
}

/**
* The main program
*/
int main()
{
Render("image.bmp", 512, 512);
return 0;
}

Пример сцены с двумя сферами, как указано выше с s1.radius = 0.33f & s2.radius = 0.33f

Сцена 1

Еще один пример сцены с двумя сферами с s1.radius = 0.33f & s2.radius = 1.0f

сцена 2

Как вы можете видеть, кажется, что камера недействительна в качестве точки зрения, поскольку независимо от того, каково положение сферы, единственным отличием является ее освещение, но она всегда будет в центре окна дисплея

0

Решение

Поскольку s2 присоединен как дочерний элемент к s1, он рисуется на 5 единиц дальше по оси X, чем s1:

s2->SetPosition(vec3((5.0f, 0.33f, -2.0f));
...
s1->AddChild(s2);

И так как ваша камера смотрит вниз по положительной оси х:

Camera *camera = new Camera(vec3(-2.0f, 2.0f, 4.0f),
vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), Camera::DefaultFov, aspect);

s2 просто тянется за s1.

0

Другие решения

Оказывается, это была не проблема с моим конструктором сцены, а то, как наследование детей / родителей работает в другом классе SceneObject*, Во всяком случае, я исправил функцию AddChild, и теперь код теперь работает с перспективой камеры и с несколькими элементами в сцене

0

По вопросам рекламы [email protected]