more fixes for matrix transforms ... projections should be working now

This commit is contained in:
Hartmut Seichter 2019-02-19 22:30:17 +01:00
parent 9db2490989
commit d2de6d410f
4 changed files with 34 additions and 32 deletions

View file

@ -104,9 +104,9 @@ struct axisangle_ {
};
typedef axisangle_<real_t> axisangle;
typedef axisangle_<double> axisangled;
typedef axisangle_<float> axisanglef;
using axisangle = axisangle_<real_t> ;
using axisanglef = axisangle_<float> ;
using axisangled = axisangle_<double> ;
}

View file

@ -38,12 +38,12 @@ struct matrix_transform {
return scale;
}
inline static
inline static
matrix_<4,4,T> perspective_frustum(const T &left,const T &right,
const T &bottom,const T &top,
const T &z_near,const T &z_far)
{
matrix_<4,4,T> frustum; frustum.zero();
const T &bottom,const T &top,
const T &z_near,const T &z_far)
{
matrix_<4,4,T> frustum; frustum.zero();
frustum(0,0) = T(2) * z_near / (right - left);
frustum(1,1) = T(2) * z_near / (top - bottom);
@ -55,8 +55,8 @@ struct matrix_transform {
frustum(3,2) = -T(1);
return frustum;
}
return frustum;
}
inline static
matrix_<4,4,T> perspective_projection(const T &field_of_view,
@ -64,14 +64,14 @@ struct matrix_transform {
const T &z_near,const T &z_far)
{
const auto tan_half = tan(field_of_view / T(2));
const auto right = aspect_ratio * tan_half * z_near;
const auto right = tan_half * z_near / aspect_ratio;
const auto left = -right;
const auto top = aspect_ratio * tan_half;
const auto top = right / aspect_ratio;
const auto bottom = -top;
return perspective_frustum(left,right,
bottom,top,
z_near,z_far);
bottom,top,
z_near,z_far);
}

View file

@ -59,19 +59,19 @@ struct quaternion_ : vector4_<T> {
);
}
inline const quaternion_ operator / (const T& rhs) const {
inline auto operator / (const T& rhs) const {
return quaternion_( { x() / rhs, y() / rhs, z() / rhs, w() / rhs, } );
}
//! conjugate
inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
inline auto conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
//! compute inverse
inline quaternion_ inverse() const {
inline auto inverse() const {
return conjugate() / this->norm();
}
inline static quaternion_ identity() {
inline static auto identity() {
return quaternion_({0,0,0,1});
}
@ -106,10 +106,10 @@ struct quaternion_ : vector4_<T> {
return m;
}
static quaternion_<T> from_matrix(const matrix_<4,4,T> &m) {
static auto from_matrix(const matrix_<4,4,T> &m) {
using std::sqrt;
const T wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2);
const T w4 = T(4.0) * wtemp;
auto wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2);
auto w4 = T(4.0) * wtemp;
return quaternion_<T>(
(m(2,1) - m(1,2)) / w4,
(m(0,2) - m(2,0)) / w4,
@ -117,11 +117,11 @@ struct quaternion_ : vector4_<T> {
wtemp);
}
static const quaternion_ normalized_lerp(const quaternion_ &a,const quaternion_ &b,const T &t) {
static auto normalized_lerp(const quaternion_ &a,const quaternion_ &b,const T &t) {
return quaternion_(lerp(a,b,t).normalized());
}
const quaternion_ slerp(const quaternion_& qa,const quaternion_& qb,const T& t)
static auto slerp(const quaternion_& qa,const quaternion_& qb,const T& t)
{
using std::abs;
using std::sqrt;
@ -160,8 +160,7 @@ struct quaternion_ : vector4_<T> {
}
static const quaternion_<T> from_axisangle(const axisangle_<T> &aa) {
static auto from_axisangle(const axisangle_<T> &aa) {
using std::sin;
using std::cos;
@ -180,9 +179,9 @@ struct quaternion_ : vector4_<T> {
//
//
//
typedef quaternion_<real_t> quaternion;
typedef quaternion_<float> quaternionf;
typedef quaternion_<double> quaterniond;
using quaternion = quaternion_<real_t>;
using quaternionf = quaternion_<float>;
using quaterniond = quaternion_<double>;

View file

@ -147,15 +147,18 @@ struct triangle_renderer
glFrontFace(GL_CCW);
#endif
#if 0
auto proj_mat = matrix_transform<float>::orthographic_projection(1.3,1.0,
0.2f,100.f);
#else
auto proj_mat = matrix_transform<float>::perspective_projection(deg_to_rad(60.f),
1.3f,
0.2f,1000.f);
// matrix4x4f proj_mat = matrix_transform<float>::perspective_projection(deg_to_rad(33.0f),
// 1.3f,
// 0.2f,1000.f);
#endif
// highly inefficient - should be cached -
shader_p.set("input_color",col);
shader_p.set("model",model_mat);