ROY RUDDLE (saprar++at++thor.cf.ac.uk)
Tue, 30 May 1995 11:37:17 +0100 (BST)
s/w below sets up 3 views on one monitor. Initial settings are 35 deg
(left + right), 90 deg (centre). Vertical FOV is 60 deg for all. This
should provide a continuous horiz FOV of 160 deg.
I realise that the gradient of displayed polygons (in XY screen
space) will be discontinuous across the viewport boundaries, but I
believe the actual height (screen Y) of polygon's should be the same on
both sides of viewport boundaries, because the vertical FOV is identical.
... but it isn't. Why?
If the viewport horizontal FOV's are all the same (commented out line)
then there is no problem.
Is this another Performer bug?
----------------------------------
model file: tmp.sv
----------------------------------
material 1 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1 0 0 0
texture 1 Texture/plain_wood.rgb
texture 2 Texture/presentation.rgb
material 1
texture 1
backface off
tmeshn 4
0 -2 1 0 0 1
0 2 1 0 0 1
0 -2 1.5 0 0 1
0 2 1.5 0 0 1
backface off
tmeshn 4
0 -2 1.6 0 0 1
0 2 1.6 0 0 1
0 -2 2.0 0 0 1
0 2 2.0 0 0 1
backface off
tmeshn 4
0 -2 2.1 0 0 1
0 2 2.1 0 0 1
0 -2 2.5 0 0 1
0 2 2.5 0 0 1
-------------------------------------
C++ code: Just one file. move mouse to rotate view left + right
-------------------------------------
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <gl/gl.h>
#include <gl/device.h>
#include <Performer/pf.h>
#include <Performer/pr.h>
#include </usr/src/Performer/include/pfutil.h>
#include </usr/src/Performer/include/pfsgi.h>
static void OpenPipeline (pfPipe *p);
static void DrawChannel (pfChannel *channel, void *data);
static pfLightSource *ls1, *ls2, *ls3;
int main()
{
pfInit();
pfConfig();
pfScene *scene;
scene = pfNewScene();
pfNode *node = LoadFile( "tmp.sv", NULL );
pfAddChild( scene, node );
pfPipe *pipe;
pipe = pfGetPipe(0);
pfInitPipe(pipe, OpenPipeline);
float near, far, v_fov;
near = 0.1; far = 8000.0; v_fov =0.0;
//
// l/r/m channels
//
float hfov1 = 90.0f, hfov2 = 35.0f;
//
// Set both hfov1 and hfov2 to be equal and everything works OK
//
//hfov1 = hfov2 = 55.0;
v_fov = 60.0f;
pfChannel *left = pfNewChan(pfGetPipe(0));
float t = pfTan( v_fov*0.5f );
float vpl = 0.15, vpr = 0.85, vpb = 0.0f, vpt = 1.0f;
const float GAP = 0.000f;
pfChanViewport( left, 0.0f, vpl-GAP, vpb, vpt );
pfChanFOV( left, hfov2, v_fov );
float gh, gv;
pfGetChanFOV( left, &gh, &gv );
cout << gh << " " << gv << endl;
pfChannel *middle = pfNewChan(pfGetPipe(0));
pfChanViewport( middle, vpl, vpr, vpb, vpt );
pfChanFOV( middle, hfov1, v_fov );
pfGetChanFOV( middle, &gh, &gv );
cout << gh << " " << gv << endl;
pfChannel *right = pfNewChan(pfGetPipe(0));
pfChanViewport( right, vpr+GAP, 1.0f, vpb, vpt );
pfChanFOV( right, hfov2, v_fov );
pfChanScene( middle, scene );
pfChanScene( left, scene );
pfChanScene( right, scene );
ls1 = pfNewLSource();
pfLightColor( ls1, 1.0f, 1.0f, 1.0f );
pfLightPos( ls1, 0.0f, 0.0f, -1.0f, 0.0f );
pfAddChild(scene, ls1 );
ls2 = pfNewLSource();
pfLightColor( ls2, 0.6f, 0.6f, 0.6f );
pfLightPos( ls2, -2.0f, -1.0f, 0.1f, 0.0f );
pfAddChild(scene, ls2 );
pfLightOn( ls2 );
ls3 = pfNewLSource();
pfLightColor( ls3, 0.3f, 0.3f, 0.3f );
//pfLightPos( ls3, 2.0f, 1.0f, 0.1f, 0.0f );
//pfLightPos( ls3, 1.0f, 2.0f, 0.1f, 0.0f );
pfLightPos( ls3, 1.0f, 1.5f, 0.1f, 0.0f );
pfAddChild(scene, ls3 );
pfLightOn( ls3 );
pfInitClock(0.0f);
pfCullFace( PFCF_BACK );
int exit_flag = 0;
pfVec3 xyz = {2.0f, 0.0f, 1.5f};
pfVec3 hpr = {90.0f, 0.0f, 0.0f};
while( exit_flag < 1000 ) {
exit_flag++;
pfSync();
float xx = (float( getvaluator(MOUSEX) ) - 1280.0*0.5) / (1280.0*0.5);
pfSetVec3( hpr, 90.0 - xx*hfov1, 0.0f, 0.0f );
pfChanView( middle, xyz, hpr );
pfSetVec3( hpr, 90.0 - xx*hfov1 + 0.5*(hfov1 + hfov2), 0.0f, 0.0f );
pfChanView( left, xyz, hpr );
pfSetVec3( hpr, 90.0 - xx*hfov1 - 0.5*(hfov1 + hfov2), 0.0f, 0.0f );
pfChanView( right, xyz, hpr );
pfFrame();
}
pfExit();
return 0;
}
static void
OpenPipeline (pfPipe *p)
{
foreground();
prefposition(0, 1280, 0, 1024);
noborder();
winopen("IRIS Performer");
pfInitGfx(p);
pfApplyMtl(pfNewMtl( NULL ));
pfEnable( PFEN_LIGHTING );
pfLightModel *lmodel = pfNewLModel( NULL );
pfLModelAmbient( lmodel, 0.4f, 0.4f, 0.4f );
pfApplyLModel( lmodel );
pfTexEnv *tev = pfNewTEnv( 0 );
pfTEnvMode( tev, PFTE_MODULATE );
pfApplyTEnv( tev );
}
static void DrawChannel (pfChannel *channel, void *data)
{
pfClearChan(channel);
pfDraw();
}
------------------------------------------------------------------------
Roy Ruddle, Principal Researcher | School of Psychology
Tel: 01222 874523 (direct) | University of Wales College of Cardiff
01222 874007 (messages) | PO Box 901
Fax: 01222 874858 | Cardiff CF1 3YG
Email: Ruddle++at++CARDIFF.AC.UK | UK
This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:51:32 PDT