some tiny fixes.

This commit is contained in:
tianlei.richard 2024-04-10 18:09:39 +08:00
parent a30c41dc46
commit 104370fb40
8 changed files with 35 additions and 46 deletions

View File

@ -6,10 +6,10 @@
#include "spdlog/spdlog.h"
Camera::Camera(const Vector3d &up)
: gaze_(Vector3d::Identity()), up_(up), camera_speed_(0.3) {}
: gaze_(Vector3d{0, 0, -1}), up_(up), camera_speed_(0.3) {}
Camera::Camera(const Vector3d &up, const float camera_speed)
: gaze_(Vector3d{0, 0, 1}), up_(up), camera_speed_(camera_speed) {
: gaze_(Vector3d{0, 0, -1}), up_(up), camera_speed_(camera_speed) {
spdlog::debug("Gaze: ({}, {}, {}), Up: ({}, {}, {})", gaze_.x(), gaze_.y(),
gaze_.z(), up_.x(), up_.y(), up_.z());
}
@ -20,19 +20,22 @@ void Camera::move(const Point3d &offset) {
void Camera::set_gaze(const Vector3d &gaze) { gaze_ = gaze.normalized(); }
const Point3d &Camera::get_position() const { return position_; }
TransformMatrix Camera::get_view_transform() const {
// Move camera to origin
TransformMatrix m{{1, 0, 0, -position_.x()},
TransformMatrix translate{{1, 0, 0, -position_.x()},
{0, 1, 0, -position_.y()},
{0, 0, 1, -position_.z()},
{0, 0, 0, 1}};
// Adjust to fit xyz
const Vector3d &x_camera{(gaze_.cross(up_)).normalized()};
m = TransformMatrix{{x_camera.x(), x_camera.y(), x_camera.z(), 0},
TransformMatrix view_mtx =
TransformMatrix{{x_camera.x(), x_camera.y(), x_camera.z(), 0},
{up_.x(), up_.y(), up_.z(), 0},
{-gaze_.x(), -gaze_.y(), -gaze_.z(), 0},
{0, 0, 0, 1}} *
m;
translate;
return m;
return view_mtx;
}

View File

@ -9,6 +9,7 @@ public:
explicit Camera(const Vector3d &up, const float camera_speed);
public:
const Point3d &get_position() const;
TransformMatrix get_view_transform() const;
public:

View File

@ -111,7 +111,6 @@ int main(int argc, char *argv[]) {
MinusRenderer renderer{near, far, fov, aspect_ratio};
renderer.set_meshes(
Mesh::load_mesh(obj_path, {{Texture::DiffuseMap, diffuse_map_path}}));
renderer.set_lamps({std::make_shared<PointLamp>(Point3d{1, 1, -1}, 6.)});
TransformMatrix translate{
{1., 0., 0., 3.}, {0., 1., 0., 3.}, {0., 0., 1., -5.}, {0., 0., 0., 1.}};
renderer.model_transform(translate);
@ -179,6 +178,8 @@ int main(int argc, char *argv[]) {
}
camera.set_gaze(Vector3d{0, 0, -1});
renderer.view_transform(camera.get_view_transform());
renderer.set_lamps(
{std::make_shared<PointLamp>(camera.get_position(), 6.)});
const auto &image = renderer.render(resolution_width, resolution_height);

View File

@ -51,23 +51,19 @@ MinusRenderer::construct_transform(const int resolution_width,
// Orthographic transform
const float height = calculate_height(fov_, near_);
const float width = calculate_width(height, aspect_ratio_);
const float right = width * 0.5;
const float left = -right;
const float top = height * 0.5;
const float bottom = -top;
const TransformMatrix &ortho_transform =
TransformMatrix{{2 / (right - left), 0, 0, 0},
{0, 2 / (top - bottom), 0, 0},
TransformMatrix{{2 / width, 0, 0, 0},
{0, 2 / height, 0, 0},
{0, 0, 2 / std::fabs(far_ - near_), 0},
{0, 0, 0, 1}} *
TransformMatrix{{1, 0, 0, -0.5 * (right - left)},
{0, 1, 0, -0.5 * (top - bottom)},
TransformMatrix{{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, -0.5 * (far_ - near_)},
{0, 0, 0, 1}};
const TransformMatrix &inv_ortho_transform{
{(right - left) / 2., 0, 0, 0.5 * (right - left)},
{0, (top - bottom) / 2., 0, 0.5 * (top - bottom)},
{width / 2., 0, 0, 0},
{0, height / 2., 0, 0},
{0, 0, std::fabs(far_ - near_) / 2., 0.5 * (far_ - near_)},
{0, 0, 0, 1}};
@ -184,7 +180,7 @@ cv::Mat MinusRenderer::render(const int resolution_width,
auto primitives = (meshes_[mesh_index]).get_primitives();
for (auto &t : primitives) {
const auto [z_min, z_max] = t.get_depth_range();
if (z_max >= far_ && z_min <= near_) {
if (z_max >= far_ && z_min <= near_) { // because the camera looks at -z
t.set_points(apply_transform(ss_transform, t.get_vertex_position()));
}
}
@ -203,19 +199,15 @@ cv::Mat MinusRenderer::render(const int resolution_width,
pixel_color = cv::Vec3b(0, 0, 0);
const auto &fragment = shading_points[y][x];
if (fragment.triangle.mesh_index >= 0 &&
fragment.triangle.mesh_index < meshes_.size()) {
const auto &mesh = meshes_[fragment.triangle.mesh_index];
if (fragment.depth <= 1. && fragment.depth >= -1.) {
const auto &mesh = meshes_[fragment.triangle.mesh_index];
const Point3d &position =
(inv_ss_transform *
(Point3d{x + 0.5, y + 0.5, fragment.depth}.homogeneous()))
.hnormalized();
pixel_color = fragment_shader(fragment, position, mesh);
}
}
}
}
return color_image;
}

View File

@ -9,7 +9,7 @@
PhoneMaterial::PhoneMaterial(
const std::unordered_map<Texture::TextureType, std::shared_ptr<Texture>>
&textures)
: textures_(textures), Ka(0.2), Ks(1.6),
: textures_(textures), Ka(0.1), Ks(1.2),
specular_attenuation_factor_(defaultAttenuationFactor) {
spdlog::info("Specular attenuation factor: {}", specular_attenuation_factor_);
}

View File

@ -19,7 +19,7 @@ void Rasterizer::rasterize(const int mesh_idx,
const std::vector<Triangle> &primitives) {
const int thread_num = 8;
std::vector<std::thread> rasterize_threads;
for (int begin = 0, offset = primitives.size() / thread_num,
for (size_t begin = 0, offset = primitives.size() / thread_num,
remainer = (primitives.size() % thread_num);
begin < primitives.size();) {
int end = begin + offset;

View File

@ -10,8 +10,8 @@
typedef struct RasterizerResult {
double depth{-std::numeric_limits<double>::infinity()};
struct {
int32_t mesh_index{-1};
int64_t triangle_index{-1};
size_t mesh_index;
size_t triangle_index;
} triangle;
} RasterizerResult;

View File

@ -2,13 +2,6 @@
// Author: tianlei.richard@qq.com (tianlei.richard)
#include "common.h"
#include <cmath>
#include <numeric>
template <typename FloatType>
bool fequal(const FloatType a, const FloatType b) {
return std::fabs(a - b) <= std::numeric_limits<FloatType>::epsilon();
}
template <int d>
std::vector<Eigen::Vector<double, d>>
@ -16,8 +9,7 @@ apply_transform(const TransformMatrix &mtx,
const std::vector<Eigen::Vector<double, d>> &points) {
std::vector<Eigen::Vector<double, d>> res{};
for (const auto &p : points) {
const auto &transform_res = mtx * p.homogeneous();
res.push_back(transform_res.hnormalized());
res.push_back((mtx * p.homogeneous()).hnormalized());
}
return res;
}
@ -26,6 +18,6 @@ template <int d>
void apply_transform_in_place(const TransformMatrix &mtx,
std::vector<Eigen::Vector<double, d>> &points) {
for (auto &p : points) {
p = mtx * p.homogeneous().hnormalized();
p = (mtx * p.homogeneous()).hnormalized();
}
}