From d98939299c0a7bf95a4981dcd29174e3cfa0b80e Mon Sep 17 00:00:00 2001 From: ubuntu20 Date: Sat, 24 Oct 2020 10:17:53 +0800 Subject: [PATCH] =?UTF-8?q?camera=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Camera.cpp | 37 +++++++++++++++++++++++++++++++++++++ Camera.h | 11 +++++++++++ Ray.cpp | 16 +++++----------- Ray.h | 11 ++++------- Scene.cpp | 6 +++++- Vector3.cpp | 10 ++++++++++ Vector3.h | 6 ++++-- raytracing.vcxproj | 4 ++++ raytracing.vcxproj.filters | 12 ++++++++++++ 9 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 Camera.cpp create mode 100644 Camera.h diff --git a/Camera.cpp b/Camera.cpp new file mode 100644 index 0000000..3fe35a6 --- /dev/null +++ b/Camera.cpp @@ -0,0 +1,37 @@ +#include"Camera.h" +#include"Ray.h" +#include +Camera::Camera(float fov, float aspect) { + mFOV = fov; + mAspect = aspect; + mNearPlaneWidth = 0.0f; + mNearPlaneHeight = 0.0f; +} +void Camera::LookAt(const Vector3& position, const Vector3& center, const Vector3& up) { + Vector3 camera_to_view_point = center - position; + float distance = camera_to_view_point.Magnitude(); + float half_fov = mFOV / 2.0f; + float radian_half_fov = half_fov * 3.14159f / 180.0f; + float half_height = atanf(radian_half_fov)*distance; + float half_width = half_height * mAspect; + mNearPlaneWidth = half_width * 2.0f; + mNearPlaneHeight = half_height * 2.0f; + camera_to_view_point.Normalize(); + Vector3 right_direction = Cross(camera_to_view_point, up); + right_direction.Normalize(); + Vector3 up_direction = Cross(right_direction, camera_to_view_point); + up_direction.Normalize(); + mUVector = right_direction; + mVVector = up_direction; + mUSpanVector = mNearPlaneWidth * mUVector; + mVSpanVector = mNearPlaneHeight * mUVector; + mCenter = center; + mPosition = position; + mUp = up; +} +Ray Camera::GetRay(float u, float v) { + u = u * 2.0f - 1.0f; + v = v * 2.0f - 1.0f; + Vector3 point_on_near_plane = mCenter + 0.5f*u*mUSpanVector + 0.5f*v*mVSpanVector; + return Ray(mPosition, point_on_near_plane - mPosition, Vector3(1.0f, 1.0f, 1.0f)); +} \ No newline at end of file diff --git a/Camera.h b/Camera.h new file mode 100644 index 0000000..1293a9b --- /dev/null +++ b/Camera.h @@ -0,0 +1,11 @@ +#pragma once +#include"Vector3.h" +class Ray; +class Camera { +public: + Vector3 mPosition, mCenter, mUp, mUVector, mVVector, mUSpanVector, mVSpanVector; + float mFOV, mAspect, mNearPlaneWidth, mNearPlaneHeight; + Camera(float fov, float aspect); + void LookAt(const Vector3& position, const Vector3& center, const Vector3& up); + Ray GetRay(float u, float v); +}; \ No newline at end of file diff --git a/Ray.cpp b/Ray.cpp index 233f0e3..75e4024 100644 --- a/Ray.cpp +++ b/Ray.cpp @@ -1,19 +1,13 @@ -#include "Ray.h" - -Ray::Ray(const Vector3 & origin, const Vector3 & direction, Vector3 & attenuation) -{ +#include"Ray.h" +Ray::Ray(const Vector3& origin, const Vector3& direction, const Vector3& attenuation) { Set(origin, direction, attenuation); } - -void Ray::Set(const Vector3 & origin, const Vector3 & direction, Vector3 & attenuation) -{ +void Ray::Set(const Vector3& origin, const Vector3& direction, const Vector3& attenuation) { mOrigin = origin; mDirection = direction; mDirection.Normalize(); mLightAttenuation = attenuation; } - -Vector3 Ray::PointAt(float k) -{ +Vector3 Ray::PointAt(float k) { return mOrigin + k * mDirection; -} +} \ No newline at end of file diff --git a/Ray.h b/Ray.h index 472e471..48352f1 100644 --- a/Ray.h +++ b/Ray.h @@ -1,12 +1,9 @@ #pragma once -#include "Vector3.h" - +#include"Vector3.h" class Ray { public: - Vector3 mOrigin; - Vector3 mDirection; - Vector3 mLightAttenuation; - Ray(const Vector3& origin, const Vector3& direction, Vector3& attenuation); - void Set(const Vector3& origin, const Vector3& direction, Vector3& attenuation); + Vector3 mOrigin, mDirection, mLightAttenuation; + Ray(const Vector3& origin, const Vector3& direction, const Vector3& attenuation); + void Set(const Vector3& origin, const Vector3& direction, const Vector3& attenuation); Vector3 PointAt(float k); }; \ No newline at end of file diff --git a/Scene.cpp b/Scene.cpp index 33263fd..e8b2a87 100644 --- a/Scene.cpp +++ b/Scene.cpp @@ -1,5 +1,7 @@ #include "Scene.h" #include "util.h" +#include "Camera.h" +#include "Ray.h" void Init(int width, int height) { @@ -8,7 +10,9 @@ void Init(int width, int height) SetColor(y, x, 255, 0, 0, 255); } } - + Camera camera(45.0f, float(width) / float(height)); + camera.LookAt(Vector3(0.0f,0.0f,1.0f), Vector3(0.0f,0.0f,0.0f), Vector3(0.0f,1.0f,0.0f)); + Ray ray = camera.GetRay(0.5f, 0.5f); } void Render() diff --git a/Vector3.cpp b/Vector3.cpp index 487f345..a48a4a0 100644 --- a/Vector3.cpp +++ b/Vector3.cpp @@ -6,6 +6,11 @@ Vector3 Vector3::operator+(const Vector3 & v) const return Vector3(x+v.x, y+v.y, z+v.z); } +Vector3 Vector3::operator-(const Vector3 & v) const +{ + return Vector3(x - v.x, y - v.y, z - v.z); +} + Vector3 Vector3::operator*(const Vector3 & v) const { return Vector3(x*v.x, y*v.y, z*v.z); @@ -59,3 +64,8 @@ float Dot(const Vector3 & l, const Vector3 & r) { return l.x * r.x + l.y * r.y + l.z * r.z; } + +Vector3 Cross(const Vector3 & l, const Vector3 & r) +{ + return Vector3(l.y*r.z - l.z*r.y, l.z*r.x - l.x*r.z, l.x*r.y - l.y*r.x); +} diff --git a/Vector3.h b/Vector3.h index 19dca76..e687c8f 100644 --- a/Vector3.h +++ b/Vector3.h @@ -1,4 +1,4 @@ -#pragma +#pragma once class Vector3 { public: union { @@ -23,6 +23,7 @@ public: z = v.z; } Vector3 operator+(const Vector3& v) const; + Vector3 operator-(const Vector3& v) const; Vector3 operator*(const Vector3& v) const; void operator*=(float scale); Vector3 operator/(float scale) const; @@ -35,4 +36,5 @@ public: float Magnitude(); }; Vector3 operator*(float f, const Vector3& v); -float Dot(const Vector3& l, const Vector3& r); \ No newline at end of file +float Dot(const Vector3& l, const Vector3& r); +Vector3 Cross(const Vector3& l, const Vector3& r); \ No newline at end of file diff --git a/raytracing.vcxproj b/raytracing.vcxproj index 1be29db..ed07c41 100644 --- a/raytracing.vcxproj +++ b/raytracing.vcxproj @@ -126,12 +126,16 @@ + + + + diff --git a/raytracing.vcxproj.filters b/raytracing.vcxproj.filters index b69360e..8dedff8 100644 --- a/raytracing.vcxproj.filters +++ b/raytracing.vcxproj.filters @@ -27,6 +27,12 @@ 源文件 + + 源文件 + + + 源文件 + @@ -38,5 +44,11 @@ 源文件 + + 源文件 + + + 源文件 + \ No newline at end of file