mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-10 22:07:19 -04:00
93 lines
2.6 KiB
C++
93 lines
2.6 KiB
C++
// Filename: stitchPerspectiveLens.cxx
|
|
// Created by: drose (09Nov99)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stitchPerspectiveLens.h"
|
|
#include "stitchCommand.h"
|
|
|
|
#include "pandatoolbase.h"
|
|
#include <deg_2_rad.h>
|
|
|
|
#include <math.h>
|
|
|
|
StitchPerspectiveLens::
|
|
StitchPerspectiveLens() {
|
|
}
|
|
|
|
void StitchPerspectiveLens::
|
|
set_hfov(double fov_deg) {
|
|
StitchLens::set_hfov(fov_deg);
|
|
_tan_fov = tan(deg_2_rad(_fov / 2.0)) * 2.0;
|
|
}
|
|
|
|
double StitchPerspectiveLens::
|
|
get_focal_length(double width_mm) const {
|
|
if (_flags & F_focal_length) {
|
|
return _focal_length;
|
|
}
|
|
if (_flags & F_fov) {
|
|
return width_mm / _tan_fov;
|
|
}
|
|
return 0.0;
|
|
}
|
|
|
|
double StitchPerspectiveLens::
|
|
get_hfov(double width_mm) const {
|
|
if (_flags & F_fov) {
|
|
return _fov;
|
|
}
|
|
if (_flags & F_focal_length) {
|
|
return 2.0 * rad_2_deg(atan(width_mm / (2.0 * _focal_length)));
|
|
}
|
|
return 0.0;
|
|
}
|
|
|
|
LVector3d StitchPerspectiveLens::
|
|
extrude(const LPoint2d &point_mm, double width_mm) const {
|
|
return LVector3d::rfu(point_mm[0], get_focal_length(width_mm), point_mm[1]);
|
|
}
|
|
|
|
LPoint2d StitchPerspectiveLens::
|
|
project(const LVector3d &vec, double width_mm) const {
|
|
double r = dot(vec, LVector3d::right());
|
|
double f = dot(vec, LVector3d::forward());
|
|
double u = dot(vec, LVector3d::up());
|
|
if (f <= 0.0) {
|
|
// If the point is in or behind our view plane, project it out to
|
|
// as near to infinity as we can comfortably manage.
|
|
return LPoint2d(r / 0.000001, u / 0.000001);
|
|
} else {
|
|
return LPoint2d(r / f * get_focal_length(width_mm),
|
|
u / f * get_focal_length(width_mm));
|
|
}
|
|
}
|
|
|
|
void StitchPerspectiveLens::
|
|
make_lens_command(StitchCommand *parent) {
|
|
StitchCommand *lens_cmd = new StitchCommand(parent, StitchCommand::C_lens);
|
|
StitchCommand *cmd;
|
|
cmd = new StitchCommand(lens_cmd, StitchCommand::C_perspective);
|
|
if (_flags & F_focal_length) {
|
|
cmd = new StitchCommand(lens_cmd, StitchCommand::C_focal_length);
|
|
cmd->set_length(_focal_length);
|
|
}
|
|
if (_flags & F_fov) {
|
|
cmd = new StitchCommand(lens_cmd, StitchCommand::C_fov);
|
|
cmd->set_number(_fov);
|
|
}
|
|
}
|