Select Git revision
Pedestrian.cpp
Pedestrian.cpp 52.64 KiB
/**
* @file Pedestrian.cpp
* @author Ulrich Kemloh <kemlohulrich@gmail.com>
* @version 0.1
* Copyright (C) <2009-2010>
*
* @section LICENSE
* This file is part of OpenPedSim.
*
* OpenPedSim is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* OpenPedSim is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenPedSim. If not, see <http://www.gnu.org/licenses/>.
*
* @section DESCRIPTION
*
* @brief
*
* Created on: 05.05.2009
*
*/
// paraview tutorial for glyph
//http://www.mail-archive.com/paraview@paraview.org/msg02142.html
#include "Pedestrian.h"
#include "geometry/JPoint.h"
#include "geometry/PointPlotter.h"
#include "geometry/LinePlotter.h"
#include "forms/Settings.h"
#include "SystemSettings.h"
#include "TrajectoryPoint.h"
#include "general/Macros.h"
#include <vtkActor.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkSphereSource.h>
#include <vtkDiskSource.h>
#include <vtkConeSource.h>
#include <vtkProperty.h>
#include <vtkAssembly.h>
#include <vtkMath.h>
#include <vtkLookupTable.h>
#include <vtkTextActor3D.h>
#include <vtkTextProperty.h>
#include <vtkCamera.h>
#include <vtkSmartPointer.h>
#include <cmath>
vtkCamera* Pedestrian::virtualCam;
#define VTK_CREATE(type, name) \
vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
using namespace std;
/**
* class Constructor
* @param ID the pedestrian ID
* @param posX the initial x coordinate
* @param posY the initial y coordinate
* @param posZ the initial z coordinate
*/
Pedestrian::Pedestrian(int ID,double posX, double posY, double posZ)
{
this->ID = ID;
this->posZ=posZ;
this->posX=posX;
this->posY=posY;
this->pedSize=160; // 160 cm
this->spaceNeeded=NULL;
//this->assembly=NULL;
this->ellipseActor=NULL;
this->trailActor=NULL;
this->pedestrianAssembly=NULL;
this->assembly3D=NULL;
this->assembly2D=NULL;
this->groupVisibilityStatus=true;
this->trailPlotterLine=NULL;
this->trailPlotterPoint=NULL;
this->caption=NULL;
this->bodyActor=NULL;
this->autoCaptionColorMode=true;
trailPoint.reserve(100);
}
/**
* Parameters less constructor
*/
Pedestrian::Pedestrian(int ID)
{
Pedestrian(ID,0,0,0);
}
/**
* class Destructor
*
*/
Pedestrian::~Pedestrian()
{
if(assembly2D)
assembly2D->Delete();
if(assembly3D)
assembly3D->Delete();
if(spaceNeeded)
spaceNeeded->Delete();
if(ellipseActor)
ellipseActor->Delete();
if(trailActor)
trailActor->Delete();
// int i=0;
//free all memory
//virtualCam->Delete();
if(bodyActor)
bodyActor->Delete();
if(caption)
caption->Delete();
while(!trailPoint.isEmpty()) {
delete trailPoint.pop();
}
if(trailPlotterPoint)
delete trailPlotterPoint;
if(trailPlotterLine)
delete trailPlotterLine;
}
/**
*
* @return the pedestrian ID
*/
int Pedestrian::getID()
{
return ID;
}
/**
*
* @return the x-coordinate of the pedestrians
*/
double Pedestrian::getX()
{
return posX;
}
/**
*
* @return the y-coordinate of the pedestrian
*/
double Pedestrian::getY()
{
return posY;
}
/**
*
* @return the z-coordinate of the pedestrian
*/
double Pedestrian::getZ()
{
return posZ;
}
/***
* create the trail and its actor
*/
void Pedestrian::createTrailActor()
{
trailPlotterPoint = new PointPlotter();
trailPlotterLine = new LinePlotter();
trailActor = vtkAssembly::New();
//VTK_CREATE(vtkAssembly,trailActor);
trailActor->AddPart(trailPlotterPoint->getActor());
trailActor->AddPart(trailPlotterLine->getActor());
}
/**
* creates and returns a plot actor for the actual
* pedestrian
*
*/
void Pedestrian::createActor()
{
//createSnowMan();
//return;
if(SystemSettings::get2D()) {
CreateActor2D();
pedestrianAssembly=assembly2D;
} else {
CreateActor3D();
pedestrianAssembly=assembly3D;
}
}
//create the 2D assembly
void Pedestrian::CreateActor2D()
{
//double headRadius = 10.0;
//double ambient=0.15;
//double diffuse=1;
//double specular=1;
assembly2D = vtkAssembly::New();
{
//private sphere
spaceNeeded = vtkDiskSource::New();
//spaceNeeded->SetRadialResolution(30);
spaceNeeded->SetCircumferentialResolution(5);
spaceNeeded->SetInnerRadius(0);
//spaceNeeded->SetOuterRadius(bodyRadius);
spaceNeeded->SetOuterRadius(2);
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(spaceNeeded->GetOutputPort());
//spaceNeeded->Delete();
ellipseActor = vtkActor::New();
ellipseActor->SetMapper(mapper);
mapper->Delete();
// they all start with red color.
ellipseActor->GetProperty()->SetColor(1.0,0.0,0.0);
//set the ellipse a little bit higher than the ground to
// eliminate interaction with the floor color.
ellipseActor->SetPosition(0,0,7);
// actor->GetProperty()->SetSpecular(specular);
// actor->GetProperty()->SetDiffuse(diffuse);
// actor->GetProperty()->SetAmbient(ambient);
// this actor belongs to both 2D and 3D
//assembly3D->AddPart(ellipseActor);
assembly2D->AddPart(ellipseActor);
//ellipseActor->Delete();
//lookup table
vtkLookupTable* lut = vtkLookupTable::New();
lut->SetHueRange(0.0,0.470);
//lut->SetSaturationRange(0,0);
lut->SetValueRange(1.0,1.0);
lut->SetNumberOfTableValues(256);
lut->Build();
mapper->SetLookupTable(lut);
lut->Delete();
}
// {//head
// {//face
// // vtkSphereSource* head = vtkSphereSource::New();
// VTK_CREATE(vtkSphereSource,head);
// head->SetThetaResolution(20);
// head->SetStartTheta(270);
// head->SetEndTheta(90);
// head->SetRadius(headRadius);
// //head->SetCenter(0,0,bodyRadius+2);
// //head->SetCenter(0,0,pedSize+2);
// // create mapper
// VTK_CREATE(vtkPolyDataMapper,mapper);
// // vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
// mapper->SetInputConnection(head->GetOutputPort());
// //head->Delete();
// //mapper->SetColorModeToMapScalars();
// //mapper->SetScalarModeToUsePointData();
//
// // create actor
// // vtkActor* actor = vtkActor::New();
// VTK_CREATE(vtkActor,actor);
// actor->SetMapper(mapper);
// //mapper->Delete();
// actor->GetProperty()->SetColor(.90,.90,1.0);
// actor->GetProperty()->SetSpecular(specular);
// actor->GetProperty()->SetDiffuse(diffuse);
// actor->GetProperty()->SetAmbient(ambient-.10);
//
// assembly2D->AddPart(actor);
// //actor->Delete();
// }
// //back
// {
// //vtkSphereSource* head = vtkSphereSource::New();
// VTK_CREATE(vtkSphereSource,head);
// head->SetThetaResolution(20);
// head->SetStartTheta(90);
// head->SetEndTheta(270);
// head->SetRadius(headRadius);
// //head->SetCenter(0,0,pedSize+2);
// // create mapper
// VTK_CREATE(vtkPolyDataMapper,mapper);
//
// // vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
// mapper->SetInputConnection(head->GetOutputPort());
// //head->Delete();
// //mapper->SetColorModeToMapScalars();
// //mapper->SetScalarModeToUsePointData();
//
// // create actor
// // vtkActor* actor = vtkActor::New();
// VTK_CREATE(vtkActor,actor);
//
// actor->SetMapper(mapper);
// //mapper->Delete();
// actor->GetProperty()->SetColor(0.35,0.35,0.35);
// actor->GetProperty()->SetSpecular(specular);
// actor->GetProperty()->SetDiffuse(diffuse);
// actor->GetProperty()->SetAmbient(ambient-.10);
//
// assembly2D->AddPart(actor);
// //actor->Delete();
// }
//}
{
//caption
char txt[10];
sprintf(txt,"%d",this->ID+1);
caption = vtkTextActor3D ::New();
caption->SetVisibility(false);
caption->SetInput(txt);
// set the properties of the caption
//FARBE
vtkTextProperty* tprop = caption->GetTextProperty();
tprop->SetFontFamilyToArial();
tprop->BoldOn();
//tprop->ShadowOn();
tprop->SetLineSpacing(1.0);
tprop->SetFontSize(SystemSettings::getPedestrianCaptionSize());
tprop->SetColor(0.0,0.0,0.0);
//tprop->SetShadowOffset(2,2);
caption->SetPosition( 0, 0,20); //20 cm on the ground
assembly2D->AddPart(caption);
}
assembly2D->SetPosition( posX, posY, posZ);
}
void Pedestrian::CreateActor3D()
{
double bodyRadius = 20.0;
double headRadius = 8.0;
double chestThikness=20.0/1.0;
double ambient=0.15;
double diffuse=1;
double specular=1;
assembly3D = vtkAssembly::New();
{
//body
vtkSphereSource* body = vtkSphereSource::New();
body->SetEndPhi(90.0);
body->SetStartPhi(0);
body->SetThetaResolution(10);
body->SetRadius(bodyRadius);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(body->GetOutputPort());
body->Delete();
// create actor
double er[]= {chestThikness/bodyRadius,1,pedSize/bodyRadius};
//double er[]={bodyRadius/bodyRadius,pedSize/bodyRadius,chestThikness/bodyRadius};
bodyActor = vtkActor::New();
bodyActor->SetMapper(mapper);
mapper->Delete();
bodyActor->SetScale(er);
//bodyActor->GetProperty()->SetColor(pedsColors);
bodyActor->GetProperty()->SetColor(pedsColors[0]/255.0,pedsColors[1]/255.0,pedsColors[2]/255.0);
//actor->GetProperty()->SetLighting(true);
bodyActor->GetProperty()->SetSpecular(specular);
bodyActor->GetProperty()->SetDiffuse(diffuse);
bodyActor->GetProperty()->SetAmbient(ambient);
//cout << "diffuse: "<<actor->GetProperty()->GetDiffuse()<<" [" << actor->GetProperty()->GetDiffuseMinValue()<<" , "<<actor->GetProperty()->GetDiffuseMaxValue() << " ]"<<endl;
//cout << "ambiant: "<<actor->GetProperty()->GetAmbient()<<" [" << actor->GetProperty()->GetAmbientMinValue()<<" , "<<actor->GetProperty()->GetAmbientMaxValue() << " ]"<<endl;
//cout << "specular:"<<actor->GetProperty()->GetSpecular()<<" [" << actor->GetProperty()->GetSpecularMinValue()<<" , "<<actor->GetProperty()->GetSpecularMaxValue()<< " ]"<<endl;
assembly3D->AddPart(bodyActor);
//bodyActor->Delete();
}
{
//caption
char txt[10];
sprintf(txt,"%d",this->ID+1);
caption = vtkTextActor3D ::New();
caption->SetVisibility(false);
caption->SetInput(txt);
// set the properties of the caption
//FARBE
vtkTextProperty* tprop = caption->GetTextProperty();
tprop->SetFontFamilyToArial();
tprop->BoldOn();
//tprop->ShadowOn();
tprop->SetLineSpacing(1.0);
tprop->SetFontSize(SystemSettings::getPedestrianCaptionSize());
tprop->SetColor(0.0,0.0,0.0);
//tprop->SetShadowOffset(2,2);
//vtkActor2D* test=vtkActor2D::New();
//assembly3D->AddPart(test);
//rotate the caption
//caption->RotateX(90);
caption->SetPosition( 0, 0,pedSize+20);
assembly3D->AddPart(caption);
}
{
//head
{
//face
vtkSphereSource* head = vtkSphereSource::New();
head->SetThetaResolution(5);
head->SetStartTheta(270);
head->SetEndTheta(90);
head->SetRadius(headRadius);
//head->SetCenter(0,0,bodyRadius+2);
head->SetCenter(0,0,pedSize+2);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(head->GetOutputPort());
head->Delete();
//mapper->SetColorModeToMapScalars();
//mapper->SetScalarModeToUsePointData();
// create actor
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(.90,.90,1.0);
actor->GetProperty()->SetSpecular(specular);
actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient-.10);
assembly3D->AddPart(actor);
actor->Delete();
}
//back
{
vtkSphereSource* head = vtkSphereSource::New();
head->SetThetaResolution(5);
head->SetStartTheta(90);
head->SetEndTheta(270);
head->SetRadius(headRadius);
head->SetCenter(0,0,pedSize+2);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(head->GetOutputPort());
head->Delete();
//mapper->SetColorModeToMapScalars();
//mapper->SetScalarModeToUsePointData();
// create actor
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(0.35,0.35,0.35);
actor->GetProperty()->SetSpecular(specular);
actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient-.10);
assembly3D->AddPart(actor);
actor->Delete();
}
}
{
//Nose
vtkConeSource* nose = vtkConeSource::New();
nose->SetCenter((headRadius+nose->GetHeight()/2) ,0,pedSize+2);
nose->SetHeight(2);
nose->SetRadius(.5);
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(nose->GetOutputPort());
nose->Delete();
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(1.0,1.0,0.0);
actor->GetProperty()->SetSpecular(specular);
actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient);
assembly3D->AddPart(actor);
actor->Delete();
}
//assembly3D->SetScale(2.500);
assembly3D->RotateZ(0.0);
assembly3D->SetPosition( posX, posY, posZ);
}
/**
* creates a snow man :)
* pedestrian
*
*/
void Pedestrian::createSnowMan()
{
this->pedSize=100; // very small snowman
double bodyRadius = 30.0;
double headRadius = 10.0;
double headCenter[3]= {0,0,pedSize-headRadius+5};
double chestCenter[3]= {0,0,0};
double bodyCenter[3]= {0,0,0};
double chestRadius= 20.0;
double ambient=0.15;
double diffuse=1;
double specular=1;
//double eyeColor[3]={217.0/255,110.0/255,163.0/255};
double eyeColor[3]= {100.0/255,100.0/255,100.0/255};
double mouthColor[3]= {204.0/255,51.0/255,51.0/255};
double hatColor[3]= {0.8,0.8,0.8};
assembly3D = vtkAssembly::New();
assembly2D = vtkAssembly::New();
{
// hat
double pos[3];
{
VTK_CREATE(vtkCylinderSource,src);
src->SetHeight(20);
src->SetRadius(8);
src->SetResolution(20);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->SetPosition(0, 0,pedSize+(src->GetHeight()/2));
actor->GetProperty()->SetColor(hatColor);
actor->RotateX(90);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
actor->GetPosition(pos);
}
{
VTK_CREATE(vtkCylinderSource,src);
src->SetHeight(2);
src->SetRadius(8.1);
src->SetResolution(20);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->SetPosition(pos);
actor->GetProperty()->SetColor(1,0.1,0.1);
actor->RotateX(90);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
VTK_CREATE(vtkCylinderSource,src);
src->SetHeight(1);
src->SetRadius(15);
src->SetResolution(20);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->SetPosition(0, 0, pedSize);
actor->GetProperty()->SetColor(hatColor);
actor->RotateX(90);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
}
{
//head
{
//face
vtkSphereSource* head = vtkSphereSource::New();
head->SetThetaResolution(5);
head->SetStartTheta(270);
head->SetEndTheta(90);
head->SetRadius(headRadius);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(head->GetOutputPort());
head->Delete();
// create actor
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(.90,.90,1.0);
actor->SetPosition(headCenter);
//actor->GetProperty()->SetSpecular(specular);
//actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient);
assembly3D->AddPart(actor);
actor->Delete();
}
//back
{
vtkSphereSource* head = vtkSphereSource::New();
head->SetThetaResolution(5);
head->SetStartTheta(90);
head->SetEndTheta(270);
head->SetRadius(headRadius);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(head->GetOutputPort());
head->Delete();
// create actor
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(0.935,0.935,0.935);
//actor->GetProperty()->SetSpecular(specular);
//actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient);
actor->SetPosition(headCenter);
assembly3D->AddPart(actor);
actor->Delete();
}
{
// eyes
float pi_over_4=0.6;
float radius=headRadius-2;
{
//left eye
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(radius*cos(pi_over_4),radius*sin(pi_over_4),headCenter[2]);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//right eye
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
//actor->SetPosition(radius*sin(3*pi_over_4),radius*cos(3*pi_over_4),headCenter[2]);
actor->SetPosition(radius*cos(-pi_over_4),radius*sin(-pi_over_4),headCenter[2]);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
}
{
//Nose
vtkConeSource* nose = vtkConeSource::New();
nose->SetHeight(8);
nose->SetRadius(2);
nose->SetResolution(30);
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(nose->GetOutputPort());
nose->Delete();
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
mapper->Delete();
actor->GetProperty()->SetColor(1.0,154.0/255.0,0.0);
//actor->GetProperty()->SetSpecular(specular);
//actor->GetProperty()->SetDiffuse(diffuse);
//actor->GetProperty()->SetAmbient(ambient);
actor->SetPosition((headRadius) ,0,pedSize-headRadius+2);
assembly3D->AddPart(actor);
actor->Delete();
}
{
//mouth
{
//first
double pos[3];
float phi=vtkMath::RadiansFromDegrees(0.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(135.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//second
double pos[3];
float phi=vtkMath::RadiansFromDegrees(10.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(130.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//third
double pos[3];
float phi=vtkMath::RadiansFromDegrees(-10.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(130.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//fourth
double pos[3];
float phi=vtkMath::RadiansFromDegrees(20.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(125.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//fifth
double pos[3];
float phi=vtkMath::RadiansFromDegrees(-20.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(125.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//sixth
double pos[3];
float phi=vtkMath::RadiansFromDegrees(25.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(115.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
//seventh
double pos[3];
float phi=vtkMath::RadiansFromDegrees(-25.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(115.0); // 0 to 180
pos[0]=headCenter[0]+headRadius*sin(theta)*cos(phi);
pos[1]=headCenter[1]+headRadius*sin(theta)*sin(phi);
pos[2]=headCenter[2]+headRadius*cos(theta);
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(1);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(mouthColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
}
}
{
// chest
{
vtkSphereSource* src = vtkSphereSource::New();
src->SetRadius(chestRadius);
src->SetThetaResolution(10);
src->SetPhiResolution(10);
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(src->GetOutputPort());
src->Delete();
vtkActor* actor = vtkActor::New();
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(1,1,1);
actor->GetProperty()->SetAmbient(ambient);
//actor->GetProperty()->SetDiffuse(0.0);
float scale=0.90;
actor->SetScale(1,1,scale);
actor->SetPosition(0,0,headCenter[2]-headRadius-chestRadius*scale+2);
actor->GetPosition(chestCenter);
actor->SetMapper(mapper);
mapper->Delete();
assembly3D->AddPart(actor);
actor->Delete();
}
{
// first knob 1
double pos[3];
float phi=vtkMath::RadiansFromDegrees(0.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(30.0); // 0 to 180
pos[0]=chestCenter[0]+chestRadius*sin(theta)*cos(phi);
pos[1]=chestCenter[1]+chestRadius*sin(theta)*sin(phi);
pos[2]=chestCenter[2]+chestRadius*cos(theta)-2;
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
// first knob 2
double pos[3];
float phi=vtkMath::RadiansFromDegrees(0.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(60.0); // 0 to 180
pos[0]=chestCenter[0]+chestRadius*sin(theta)*cos(phi);
pos[1]=chestCenter[1]+chestRadius*sin(theta)*sin(phi);
pos[2]=chestCenter[2]+chestRadius*cos(theta)-2;
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
// first knob 3
double pos[3];
float phi=vtkMath::RadiansFromDegrees(0.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(90.0); // 0 to 180
pos[0]=chestCenter[0]+chestRadius*sin(theta)*cos(phi);
pos[1]=chestCenter[1]+chestRadius*sin(theta)*sin(phi);
pos[2]=chestCenter[2]+chestRadius*cos(theta)-0;
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
{
// first knob 4
double pos[3];
float phi=vtkMath::RadiansFromDegrees(0.0); // 0 to 360
float theta=vtkMath::RadiansFromDegrees(120.0); // 0 to 180
pos[0]=chestCenter[0]+chestRadius*sin(theta)*cos(phi);
pos[1]=chestCenter[1]+chestRadius*sin(theta)*sin(phi);
pos[2]=chestCenter[2]+chestRadius*cos(theta)-0;
VTK_CREATE(vtkSphereSource,src);
src->SetRadius(2);
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(src->GetOutputPort());
VTK_CREATE(vtkActor,actor);
actor->GetProperty()->SetLighting(true);
actor->GetProperty()->SetColor(eyeColor);
//actor->GetProperty()->SetAmbient(0.2);
//actor->GetProperty()->SetDiffuse(0.8);
actor->SetPosition(pos);
actor->SetMapper(mapper);
assembly3D->AddPart(actor);
}
}
{
//body
vtkSphereSource* body = vtkSphereSource::New();
//body->SetEndPhi(90.0);
//body->SetStartPhi(0);
body->SetThetaResolution(10);
body->SetThetaResolution(10);
body->SetRadius(bodyRadius);
// create mapper
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(body->GetOutputPort());
body->Delete();
// create actor
//double er[]={chestThikness/bodyRadius,1,pedSize/bodyRadius};
//double er[]={bodyRadius/bodyRadius,pedSize/bodyRadius,chestThikness/bodyRadius};
bodyCenter[2]=chestCenter[2]-chestRadius-body->GetRadius()+10;
bodyActor = vtkActor::New();
bodyActor->SetMapper(mapper);
mapper->Delete();
bodyActor->SetScale(1,1,0.90);
// bodyActor->GetProperty()->SetColor(pedsColors[0]/255.0,pedsColors[1]/255.0,pedsColors[2]/255.0);
bodyActor->GetProperty()->SetColor(1,1,1);
//actor->GetProperty()->SetLighting(true);
//bodyActor->GetProperty()->SetSpecular(specular);
//bodyActor->GetProperty()->SetDiffuse(diffuse);
bodyActor->GetProperty()->SetAmbient(ambient);
bodyActor->SetPosition(0,0,bodyCenter[2]);
assembly3D->AddPart(bodyActor);
}
assembly3D->SetPosition( posX, posY, posZ);
//create the 2D assembly
{
//private sphere
spaceNeeded = vtkDiskSource::New();
//spaceNeeded->SetRadialResolution(30);
spaceNeeded->SetCircumferentialResolution(5);
spaceNeeded->SetInnerRadius(0);
//spaceNeeded->SetOuterRadius(bodyRadius);
spaceNeeded->SetOuterRadius(2);
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(spaceNeeded->GetOutputPort());
//spaceNeeded->Delete();
ellipseActor = vtkActor::New();
ellipseActor->SetMapper(mapper);
mapper->Delete();
// they all start with red color.
ellipseActor->GetProperty()->SetColor(1.0,0.0,0.0);
//set the ellipse a little bit higher than the ground to
// eliminate interaction with the floor color.
ellipseActor->SetPosition(0,0,47);
// this actor belongs to both 2D and 3D
//assembly3D->AddPart(ellipseActor);
assembly2D->AddPart(ellipseActor);
//ellipseActor->Delete();
//lookup table
vtkLookupTable* lut = vtkLookupTable::New();
lut->SetHueRange(0.0,0.470);
//lut->SetSaturationRange(0,0);
lut->SetValueRange(1.0,1.0);
lut->SetNumberOfTableValues(256);
lut->Build();
mapper->SetLookupTable(lut);
lut->Delete();
}
{
//head
{
//face
VTK_CREATE(vtkSphereSource,head);
head->SetThetaResolution(20);
head->SetStartTheta(270);
head->SetEndTheta(90);
head->SetRadius(headRadius);
//head->SetCenter(0,0,bodyRadius+2);
//head->SetCenter(0,0,pedSize+2);
// create mapper
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(head->GetOutputPort());
// create actor
VTK_CREATE(vtkActor,actor);
actor->SetMapper(mapper);
//mapper->Delete();
actor->GetProperty()->SetColor(.90,.90,1.0);
actor->GetProperty()->SetSpecular(specular);
actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient-.10);
//assembly2D->AddPart(actor);
//actor->Delete();
}
//back
{
VTK_CREATE(vtkSphereSource,head);
head->SetThetaResolution(20);
head->SetStartTheta(90);
head->SetEndTheta(270);
head->SetRadius(headRadius);
//head->SetCenter(0,0,pedSize+2);
// create mapper
VTK_CREATE(vtkPolyDataMapper,mapper);
mapper->SetInputConnection(head->GetOutputPort());
// create actor
VTK_CREATE(vtkActor,actor);
actor->SetMapper(mapper);
//mapper->Delete();
actor->GetProperty()->SetColor(0.35,0.35,0.35);
actor->GetProperty()->SetSpecular(specular);
actor->GetProperty()->SetDiffuse(diffuse);
actor->GetProperty()->SetAmbient(ambient-.10);
//assembly2D->AddPart(actor);
//actor->Delete();
}
assembly2D->SetPosition( posX, posY, posZ);
}
{
//caption
char txt[10];
sprintf(txt,"%d",this->ID+1);
caption = vtkTextActor3D ::New();
caption->SetVisibility(false);
caption->SetInput(txt);
// set the properties of the caption
//FARBE
vtkTextProperty* tprop = caption->GetTextProperty();
tprop->SetFontFamilyToArial();
tprop->BoldOn();
//tprop->ShadowOn();
tprop->SetLineSpacing(1.0);
tprop->SetFontSize(SystemSettings::getPedestrianCaptionSize());
tprop->SetColor(0.0,0.0,0.0);
//tprop->SetShadowOffset(2,2);
if(SystemSettings::get2D()) {
caption->SetPosition( 0, 0,20); //20 cm on the ground
//assembly2D->AddPart(caption);
} else {
//vtkActor2D* test=vtkActor2D::New();
//assembly3D->AddPart(test);
//rotate the caption
//caption->RotateX(90);
caption->SetPosition( 0, 0,pedSize+20);
//assembly3D->AddPart(caption);
}
}
if(SystemSettings::get2D())pedestrianAssembly=assembly2D;
else pedestrianAssembly=assembly3D;
}
void Pedestrian::setColor(int color[3])
{
pedsColors[0]=color[0];
pedsColors[1]=color[1];
pedsColors[2]=color[2];
if(bodyActor!=NULL)
// bodyActor->GetProperty()->SetColor(pedsColors);
bodyActor->GetProperty()->SetColor(pedsColors[0]/255.0,pedsColors[1]/255.0,pedsColors[2]/255.0);
}
void Pedestrian::setColor(int color)
{
// ich klaue mal die Farbe von der Ellipse
if(bodyActor!=NULL) {
double *col =ellipseActor->GetMapper()->GetLookupTable()->GetColor((double)color/255.0);
bodyActor->GetProperty()->SetColor(col);
} else {
//lookup table
vtkLookupTable* lut = vtkLookupTable::New();
lut->SetHueRange(0.0,0.470);
//lut->SetSaturationRange(0,0);
lut->SetValueRange(1.0,1.0);
lut->SetNumberOfTableValues(256);
lut->Build();
lut->GetColor((double)color/255.0,pedsColors);
pedsColors[0]*=255;
pedsColors[1]*=255;
pedsColors[2]*=255;
}
}
/// returns the actor to the pedestrians.
/// creates one if not existing
vtkAssembly * Pedestrian::getActor()
{
if(pedestrianAssembly==NULL) createActor();
//if(pedestrianAssembly==NULL) createSnowMan();
return pedestrianAssembly;
}
/// returns the actor to the pedestrians trail.
/// creates one if inexisting
vtkAssembly * Pedestrian::getTrailActor()
{
if(trailActor==NULL) createTrailActor();
return trailActor;
}
/**
*
* move the pedestrian to its new position
*/
//void Pedestrian::moveTo(TrajectoryPoint *point) {
/*
double xNew ;//= point->getX();
double yNew ;//= point->getY();
double zNew ;//= point->getZ();
double ellipse[7];
double agentColorAngle[2];
//point->getEllipse(ellipse);
//point->getAgentInfo(agentColorAngle);
// this are radius
double ellipseColor=1; //red
// scaling the disk to an ellipse
// radiusA and radiusB are given
if( !( isnan(ellipse[3])|| isnan(ellipse[4])) ){
//TODO: this wont be necessary when they stop explode
// dont allow ellipse greater than 1 meter
ellipse[3]= (ellipse[3]>100)?100:ellipse[3];
ellipse[4]= (ellipse[4]>100)?100:ellipse[4];
double radius = spaceNeeded->GetOuterRadius();
double scale[3] = { ellipse[3] / radius, ellipse[4] / radius, 1 };
ellipseActor->SetScale(scale);
//color is not given
if( isnan(ellipse[6])){
double maxEllipseDiameter = 40;
double minEllipseDiameter = 1;
ellipseColor= (ellipse[4]+ellipse[3])/2.0;
ellipseColor = (ellipseColor - minEllipseDiameter) / (maxEllipseDiameter - minEllipseDiameter);
}else{
ellipseColor=ellipse[6]/255;
}
}
//todo: could make this variable global to use with trails
double *elColorRGB = ellipseActor->GetMapper()->GetLookupTable()->GetColor(ellipseColor);
ellipseActor->GetProperty()->SetColor(elColorRGB);
//default agent orientation
double pedestrianOrientation = vtkMath::DegreesFromRadians(atan2((yNew - posY), (xNew
- posX)));//-lastRotationAngle;
if (pedestrianOrientation < 0)
pedestrianOrientation += 360.0;
if(isnan(agentColorAngle[1])==false){ //agent orientation
pedestrianOrientation=agentColorAngle[1];
}
// this is useful when the system is paused.
// cuz moveTo is still called, just with the same coordinates
if ((posX != xNew) || (posY != yNew) || (posZ!=zNew)) {
double ori[3];
pedestrianAssembly->GetOrientation(ori);
pedestrianAssembly->RotateZ(pedestrianOrientation-ori[2]);
//adjust the caption
if(autoCaptionColorMode){
vtkTextProperty* tprop = caption->GetTextProperty();
tprop->SetColor(1-elColorRGB[0],1-elColorRGB[1],1-elColorRGB[2]);
}
}
//set the new position
pedestrianAssembly->SetPosition(xNew, yNew, zNew);
// ellipse are only available in 2D mode and the centre coordinates may be different
// from the head\s one
if(SystemSettings::get2D()){
//the ellipses are not "on" the floor, but slightly over , thats why +1 is added to z;
ellipseActor->SetPosition(ellipse[0]-xNew,ellipse[1]-yNew,ellipse[2]-zNew+2);
}
//adjust the camera
if(ID==SystemSettings::getVirtualAgent()){
static bool cam=true;
virtualCam->SetPosition(posX+15,posY,posZ+pedSize+8);
//new focal point
float eyeRange=150;//15m
//float angle=vtkMath::RadiansFromDegrees(pedestrianOrienation);
//float x=posX+eyeRange*cos(angle);
// float y=posY+eyeRange*sin(angle);
virtualCam->SetFocalPoint(xNew+15,yNew,zNew+pedSize+8);
//virtualCam->SetFocalPoint(x,y,zNew+pedSize+8);
//virtualCam->Azimuth(pedestrianOrienation);
//virtualCam->Azimuth(pedestrianOrienation);
//virtualCam->Yaw(pedestrianOrienation);
virtualCam->SetDistance(eyeRange);
//virtualCam->SetDir
if(cam)virtualCam->SetRoll(90);
cam=false;
virtualCam->Modified();
}
// save the actual position
// needed for computing the rotation angle if missing
posX = xNew;
posY = yNew;
posZ = zNew;
pedestrianAssembly->SetVisibility(groupVisibilityStatus);
trailActor->SetVisibility(groupVisibilityStatus & extern_tracking_enable);
triggerPlotTrail();
*/
//}
///**
// *
// * move the pedestrian to its new position
// */
//
//void Pedestrian::moveTo(TrajectoryPoint *point) {
//
// double xNew = point->getX();
// double yNew = point->getY();
// double zNew = point->getZ();
// double ellipse[7];
// double agentColorAngle[2];
//
// point->getEllipse(ellipse);
// point->getAgentInfo(agentColorAngle);
//
// // this are radius
// const double maxEllipseDiameter = 40;
// const double minEllipseDiameter = 1;
// double ellipseColor=1; //red
//
//
// // scaling the disk to an ellipse
// // radiusA and radiusB are given
// if( !( isnan(ellipse[3])|| isnan(ellipse[4])) ){
//
// //TODO: FIXME: this wont be necessary when they stop explode
// ellipse[3]= (ellipse[3]>100)?100:ellipse[3];
// ellipse[4]= (ellipse[4]>100)?100:ellipse[4];
//
// double radius = spaceNeeded->GetOuterRadius();
// double scale[3] = { ellipse[3] / radius, ellipse[4] / radius, 1 };
// ellipseActor->SetScale(scale);
//
// //color is not given
// if( isnan(ellipse[6])){
// ellipseColor= (ellipse[4]+ellipse[3])/2.0;
// ellipseColor = (ellipseColor - minEllipseDiameter) / (maxEllipseDiameter - minEllipseDiameter);
// }else{
// ellipseColor=ellipse[6]/255;
// }
// }
//
// //todo: could make this variable global to use with trails
// double *elColorRGB = ellipseActor->GetMapper()->GetLookupTable()->GetColor(ellipseColor);
// ellipseActor->GetProperty()->SetColor(elColorRGB);
//
//
// //default agent orientation
// double defaultOrientation = vtkMath::DegreesFromRadians(atan2((yNew - posY), (xNew
// - posX)));//-lastRotationAngle;
// if (defaultOrientation < 0)
// defaultOrientation += 360.0;
//
// double pedestrianOrienation=defaultOrientation-lastPedestrianOrientation;
// if(! isnan(agentColorAngle[1])) //agent orientation
// pedestrianOrienation=agentColorAngle[1];
//
// double ellipseOrientation =pedestrianOrienation;//default
// if(!( isnan(ellipse[5]))) //ellipse orientation
// ellipseOrientation= ellipse[5];
//
// // this is useful when the system is paused.
// // cuz moveTo is still called, just with the same coordinates
// if ((posX != xNew) || (posY != yNew) || (posZ!=zNew)) {
// pedestrianAssembly->RotateZ(pedestrianOrienation);
// //the ellipse should rotate independently to the agent
// lastPedestrianOrientation=defaultOrientation;
// ellipseActor->RotateZ(ellipseOrientation-pedestrianOrienation-lastEllipseOrientation);
// lastEllipseOrientation=ellipseOrientation;
//
// //adjust the caption
// caption->RotateZ(-pedestrianOrienation);
// if(autoCaptionColorMode){
// vtkTextProperty* tprop = caption->GetTextProperty();
// tprop->SetColor(1-elColorRGB[0],1-elColorRGB[1],1-elColorRGB[2]);
// }
// }
// //set the new position
// pedestrianAssembly->SetPosition(xNew, yNew, zNew);
//
// // ellipse are only available in 2D mode and the centre coordinates may be different
// // from the head\s one
// if(SystemSettings::get2D()){
// //the ellipses are not "on" the floor, but slightly over , thats why +1 is added to z;
// ellipseActor->SetPosition(ellipse[0]-xNew,ellipse[1]-yNew,ellipse[2]-zNew+2);
// }
//
//
//
// //adjust the camera
// if(ID==SystemSettings::getVirtualAgent()){
//
// static bool cam=true;
// virtualCam->SetPosition(posX+15,posY,posZ+pedSize+8);
//
// //new focal point
// float eyeRange=150;//15m
//
// //float angle=vtkMath::RadiansFromDegrees(pedestrianOrienation);
// //float x=posX+eyeRange*cos(angle);
// // float y=posY+eyeRange*sin(angle);
// virtualCam->SetFocalPoint(xNew+15,yNew,zNew+pedSize+8);
// //virtualCam->SetFocalPoint(x,y,zNew+pedSize+8);
// //virtualCam->Azimuth(pedestrianOrienation);
// //virtualCam->Azimuth(pedestrianOrienation);
// //virtualCam->Yaw(pedestrianOrienation);
// virtualCam->SetDistance(eyeRange);
// //virtualCam->SetDir
// if(cam)virtualCam->SetRoll(90);
// cam=false;
// virtualCam->Modified();
//
// }
// // save the actual position
// // needed for computing the rotation angle if missing
// posX = xNew;
// posY = yNew;
// posZ = zNew;
// pedestrianAssembly->SetVisibility(groupVisibilityStatus);
//
// trailActor->SetVisibility(groupVisibilityStatus & extern_tracking_enable);
// triggerPlotTrail();
//
//}
bool Pedestrian::isVisible()
{
return pedestrianAssembly->GetVisibility();
}
void Pedestrian::setVisibility(bool status)
{
if(pedestrianAssembly==NULL) {
createActor();
createTrailActor();
}
pedestrianAssembly->SetVisibility(status);
trailActor->SetVisibility(status);
}
void Pedestrian::setVisualModeTo2D(bool mode)
{
if(mode) { //2D
pedestrianAssembly=assembly2D;
assembly3D->SetVisibility(false);
} else { // 3D
pedestrianAssembly=assembly3D;
assembly2D->SetVisibility(false);
}
pedestrianAssembly->Modified();
}
/// set the group visibility status
void Pedestrian::setGroupVisibility(bool status)
{
groupVisibilityStatus=status;
}
/// get the group visibility
bool Pedestrian::getGroupVisibility()
{
return groupVisibilityStatus;
}
void Pedestrian::setSize(double size)
{
this->pedSize=size;
}
void Pedestrian::enableCaption(bool status)
{
if(caption!=NULL)
this->caption->SetVisibility(status);
}
void Pedestrian::plotTrail(double x, double y, double z)
{
trailPoint.push(new JPoint (x,y,z));
}
void Pedestrian::setTrailGeometry(int type)
{
switch(type) {
case 0: // points
//trailPlotterLine->getActor()->SetVisibility(0);
trailPlotterPoint->getActor()->SetVisibility(1);
break;
case 1: // polygone
//trailPlotterLine->getActor()->SetVisibility(1);
trailPlotterPoint->getActor()->SetVisibility(0);
break;
}
}
void Pedestrian::triggerPlotTrail()
{
if(trailPoint.isEmpty()) return;
if(trailPoint.size()<2) return;
// make color uniform and use only [0,255]
//double color[3]={pedsColors[0],255*pedsColors[1],255*pedsColors[2]};
trailPlotterLine->clear();
trailPlotterLine->SetNumberOfPoints(trailPoint.size());
// Point * first = trailPoint.pop();
// first->setColorRGB(color[0],color[1],color[2]);
// trailPlotterPoint->PlotPoint(first);
// trailPlotterLine->addVertex(first);
while (!trailPoint.isEmpty()) {
JPoint * next = trailPoint.pop();
next->setColorRGB(pedsColors[0],pedsColors[1],pedsColors[2]);
//trailPlotterLine->PlotLine(first, next);
trailPlotterPoint->PlotPoint(next);
trailPlotterLine->addVertex(next);
delete(next);
}
trailPoint.clear();
}
void Pedestrian::setCaptionSize(int size)
{
vtkTextProperty* tprop = caption->GetTextProperty();
//tprop->SetFontFamilyToArial();
//tprop->BoldOn();
//tprop->ShadowOn();
//tprop->SetLineSpacing(1.0);
//tprop->SetColor(1.0,0.0,0.0);
tprop->SetFontSize(size);
}
void Pedestrian::setCamera(vtkCamera* cam)
{
virtualCam=cam;
}
void Pedestrian::setCaptionsColor(QColor& col)
{
double captionColors[3];
captionColors[0]=(double)col.red()/255;
captionColors[1]=(double)col.green()/255;
captionColors[2]=(double)col.blue()/255;
vtkTextProperty* tprop = caption->GetTextProperty();
//tprop->SetFontFamilyToArial();
//tprop->BoldOn();
//tprop->ShadowOn();
//tprop->SetLineSpacing(1.0);
tprop->SetColor(captionColors);
// tprop->SetFontSize(size);
}
void Pedestrian::setCaptionsColorModeToAuto(bool status)
{
autoCaptionColorMode=status;
}
void Pedestrian::setResolution(int pts)
{
spaceNeeded->SetRadialResolution(pts);
spaceNeeded->SetCircumferentialResolution(pts);
}