Browse Source

camera类

master
ubuntu20 4 years ago
parent
commit
d98939299c
  1. 37
      Camera.cpp
  2. 11
      Camera.h
  3. 16
      Ray.cpp
  4. 11
      Ray.h
  5. 6
      Scene.cpp
  6. 10
      Vector3.cpp
  7. 6
      Vector3.h
  8. 4
      raytracing.vcxproj
  9. 12
      raytracing.vcxproj.filters

37
Camera.cpp

@ -0,0 +1,37 @@
#include"Camera.h"
#include"Ray.h"
#include<math.h>
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));
}

11
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);
};

16
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;
}
}

11
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);
};

6
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()

10
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);
}

6
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);
float Dot(const Vector3& l, const Vector3& r);
Vector3 Cross(const Vector3& l, const Vector3& r);

4
raytracing.vcxproj

@ -126,12 +126,16 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Camera.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="Ray.cpp" />
<ClCompile Include="Scene.cpp" />
<ClCompile Include="util.cpp" />
<ClCompile Include="Vector3.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Camera.h" />
<ClInclude Include="Ray.h" />
<ClInclude Include="Scene.h" />
<ClInclude Include="util.h" />
<ClInclude Include="Vector3.h" />

12
raytracing.vcxproj.filters

@ -27,6 +27,12 @@
<ClCompile Include="Vector3.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Ray.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Camera.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Scene.h">
@ -38,5 +44,11 @@
<ClInclude Include="Vector3.h">
<Filter>源文件</Filter>
</ClInclude>
<ClInclude Include="Ray.h">
<Filter>源文件</Filter>
</ClInclude>
<ClInclude Include="Camera.h">
<Filter>源文件</Filter>
</ClInclude>
</ItemGroup>
</Project>
Loading…
Cancel
Save