//A.18 场景图形示例
//scene.cc
#include "Scene.h"
#define BaseRadius 0.2
#define Radius 0.08
#define BaseLen 1
#define UpLen 0.6
#define LowLen 0.6
#define EyeRadius 0.04
#define ChairLegLen 0.55
int main(int argc, char **argv)
{
float v[][3]={{-0.3,-0.2,0.0},{0.3, -0.2, 0.0},
{0.3, 0.2, 0.0},{-0.3, 0.2, 0.0} };
//Light nodes
Light *Light1=new Light;
Light *Light2=new Light;
TurnOff *Off1=new TurnOff(Light1);
TurnOff *Off2=new TurnOff(Light2);
//Setting Light Values :
Light1->SetValue(POSITION, -2, -3, 1.5, 1);
Light1->SetValue(SPOT_DIRECTION, 2, 3, -1.5);
Light1->SetValue(CUTOFFANGLE, 40.0);
Light1->TurnOn();
Light2->SetValue(POSITION, 5, 5, 5, 0);
Light2->SetValue(SPECULAR, 1.0, 1.0, 1.0, 1.0);
Light2->SetValue(DIFFUSE, 1.0, 1.0, 1.0, 1.0);
Light2->TurnOn();
//Nodes for Camera:
Camera *Camera1=new Camera(PERSPECTIVE);
Camera1->SetValue(POSITION, 2.2, 0.9, 3);
Camera1->SetValue(AIMAT, 0, 0, 0);
Camera1->SetValue(UPDIRECTION, 0, 1, 0);
Camera1->SetValue(ASPECT, 1);
Camera1->SetValue(NEAR, 1);
Camera1->SetValue(FAR, 20);
Camera1->SetValue(YANGLE, 50);
//Nodes for Robot:
Material *RobotMat=new Material;
Material *EyeMat=new Material;
Cylinder *Base=new Cylinder;
Sphere *Head=new Sphere;
Sphere *EyeL=new Sphere;
Sphere *EyeR=new Sphere;
Cylinder *UpperArmL=new Cylinder;
Cylinder *UpperArmR=new Cylinder;
Cylinder *LowerArmL=new Cylinder;
Cylinder *LowerArmR=new Cylinder;
Cylinder *UpperLegL=new Cylinder;
Cylinder *UpperLegR=new Cylinder;
Cylinder *LowerLegL=new Cylinder;
Cylinder *LowerLegR=new Cylinder;
Polygon *Paper=new Polygon;
Transformation *EyeLTrans=new Transformation;
Transformation *EyeRTrans=new Transformation;
Transformation *HeadTrans=new Transformation;
Transformation *UpArmLTrans=new Transformation;
Transformation *UpArmRTrans=new Transformation;
Transformation *LowArmTrans=new Transformation;
Transformation *UpLegLTrans=new Transformation;
Transformation *UpLegRTrans=new Transformation;
Transformation *LowLegTrans=new Transformation;
Transformation *BaseTrans=new Transformation;
//Robot Value:
RobotMat->SetValue(DIFFUSE, 0.0, 0.0, 1.0, 1.0);
RobotMat->SetValue(AMBIENT, 0.0, 0.0, 1.0, 1.0);
RobotMat->SetValue(SPECULAR, 1.0, 1.0, 1.0, 1.0);
RobotMat->SetValue(SHININESS, 100.0);
EyeMat->SetValue(DIFFUSE, 1.0, 1.0, 1.0, 1.0);
EyeMat->SetValue(AMBIENT, 1.0, 1.0, 1.0, 1.0);
EyeMat->SetValue(SPECULAR, 1.0, 1.0, 1.0, 1.0);
EyeMat->SetValue(SHININESS, 100.0);
Base->SetValue(HEIGHT, BaseLen);
Base->SetValue(RADIUS, BaseRadius);
Head->SetValue(RADIUS, BaseRadius);
EyeL->SetValue(RADIUS, EyeRadius);
EyeR->SetValue(RADIUS, EyeRadius);
UpperArmL->SetValue(HEIGHT, UpLen);
UpperArmL->SetValue(RADIUS, Radius);
LowerArmL->SetValue(HEIGHT, LowLen);
LowerArmL->SetValue(RADIUS, Radius);
UpperArmR->SetValue(HEIGHT, UpLen);
UpperArmR->SetValue(RADIUS, Radius);
LowerArmR->SetValue(HEIGHT, LowLen);
LowerArmR->SetValue(RADIUS, Radius);
UpperLegL->SetValue(HEIGHT, UpLen);
UpperLegL->SetValue(RADIUS, Radius);
LowerLegL->SetValue(HEIGHT, LowLen);
LowerLegL->SetValue(RADIUS, Radius);
UpperLegR->SetValue(HEIGHT, UpLen);
UpperLegR->SetValue(RADIUS, Radius);
LowerLegR->SetValue(HEIGHT, LowLen);
LowerLegR->SetValue(RADIUS, Radius);
Paper->SetVerticesv(v, 4);
Paper->SetMaterial(EyeMat);
EyeLTrans->SetValue(TRANSLATION, BaseRadius-EyeRadius/2, 0, 0, 0);
EyeLTrans->SetValue(ROTATION, 30, 0, 0, 1, 1);
EyeRTrans->SetValue(TRANSLATION, BaseRadius-EyeRadius/2, 0, 0, 0);
EyeRTrans->SetValue(ROTATION, -30, 0, 0, 1, 1);
HeadTrans->SetValue(TRANSLATION, 0, 0,
BaseLen+BaseRadius+BaseRadius/3, 0);
UpArmLTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
UpArmLTrans->SetValue(ROTATION, -45, 0, 1, 0, 1);
UpArmLTrans->SetValue(TRANSLATION, 0, BaseRadius+Radius, BaseLen,
2);
UpArmRTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
UpArmRTrans->SetValue(ROTATION, -45, 0, 1, 0, 1);
UpArmRTrans->SetValue(TRANSLATION, 0, -(BaseRadius+Radius),
BaseLen, 2);
LowArmTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
LowArmTrans->SetValue(ROTATION, -45, 0, 1, 0, 1);
UpLegLTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
UpLegLTrans->SetValue(ROTATION, -90, 0, 1, 0, 1);
UpLegLTrans->SetValue(TRANSLATION, 0, BaseRadius+Radius, 0, 2);
UpLegRTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
UpLegRTrans->SetValue(ROTATION, -100, 0, 1, 0, 1);
UpLegRTrans->SetValue(TRANSLATION, 0, -(BaseRadius+Radius), 0, 2);
LowLegTrans->SetValue(TRANSLATION, 0, 0, -UpLen, 0);
LowLegTrans->SetValue(ROTATION, 95, 0, 1, 0, 1);
BaseTrans->SetValue(ROTATION, -90, 1, 0, 0, 0);
BaseTrans->SetValue(ROTATION, -10, 0, 0, 1, 1);
Head->SetTransform(HeadTrans);
EyeL->SetTransform(EyeLTrans);
EyeR->SetTransform(EyeRTrans);
EyeR->SetMaterial(EyeMat);
EyeL->SetMaterial(EyeMat);
UpperArmL->SetTransform(UpArmLTrans);
LowerArmL->SetTransform(LowArmTrans);
UpperArmR->SetTransform(UpArmRTrans);
LowerArmR->SetTransform(LowArmTrans);
UpperLegL->SetTransform(UpLegLTrans);
LowerLegL->SetTransform(LowLegTrans);
UpperLegR->SetTransform(UpLegRTrans);
LowerLegR->SetTransform(LowLegTrans);
Base->SetTransform(BaseTrans);
Paper->SetTransform(ROTATION, 20, 0, 1, 0, 0);
Paper->SetTransform(TRANSLATION, 0.05, -0.15, -0.2, 1);
//Set Relationship in Robot:
RobotMat->AddChild(Light1);
Light1->AddChild(Base);
Base->AddChild(Off1);
Off1->AddChild(Light2);
Light2->AddChild(Head);
Head->AddChild(Off2);
Head->AddChild(EyeL);
Head->AddChild(EyeR);
Base->AddChild(UpperArmL);
UpperArmL->AddChild(LowerArmL);
Base->AddChild(UpperArmR);
UpperArmR->AddChild(LowerArmR);
Base->AddChild(UpperLegL);
UpperLegL->AddChild(LowerLegL);
Base->AddChild(UpperLegR);
UpperLegR->AddChild(LowerLegR);
LowerArmR->AddChild(Paper);
//Nodes for Chair:
Cube *Seat=new Cube(0.7, 0.06, 0.7);
Line *Leg1=new Line;
Line *Leg2=new Line;
Line *Leg3=new Line;
Line *Leg4=new Line;
DrawStyle *LegStyle=new DrawStyle;
Color *ChairColor=new Color;
//Chair Value:
float v1[][3]={{-0.3, 0, 0.3},{-0.35, -1*ChairLegLen, 0.3}};
float v2[][3]={{0.3, 0, 0.3},{0.35, -1*ChairLegLen, 0.3}};
float v3[][3]={{0.3, 0, -0.3},{0.35, -1*ChairLegLen, -0.3}};
float v4[][3]={{-0.3, 0, -0.3},{-0.35, -1*ChairLegLen, -0.3}};
ChairColor->SetValue(RED);
Seat->SetTransform(TRANSLATION, 0, -0.15, 0, 0);
LegStyle->SetValue(LINEWIDTH, 7);
Leg1->SetStyle(LegStyle);
Leg1->SetVerticesv(v1);
Leg2->SetStyle(LegStyle);
Leg2->SetVerticesv(v2);
Leg3->SetStyle(LegStyle);
Leg3->SetVerticesv(v3);
Leg4->SetStyle(LegStyle);
Leg4->SetVerticesv(v4);
Seat->AddChild(Leg1);
Seat->AddChild(Leg2);
Seat->AddChild(Leg3);
Seat->AddChild(Leg4);
ChairColor->AddChild(Seat);
//Transformation Nodes for both Robot and Chair:
Transformation *Trans1=new Transformation;
Trans1->SetValue(TRANSLATION, -0.5, 0, 0, 2);
Trans1->AddChild(ChairColor);
Trans1->AddChild(RobotMat);
//Root Node:
Node *Root=new Node;
Root->AddChild(Trans1);
Root->AddChild(Camera1);
//Viewer:
GLViewer *MyViewer=new GLViewer;
MyViewer->Init(argc, argv);
MyViewer->SetValue(BACKCOLOR, GREY);
MyViewer->SetValue(BUFFER, DOUBLE);
MyViewer->CreateWin("Working Hard", 500, 500);
GLViewer *MyViewer2=new GLViewer;
MyViewer2->Init(argc, argv);
MyViewer2->SetValue(BACKCOLOR, MAGENTA);
MyViewer2->CreateWin("Working Hard2", 200, 200);
MyViewer2->SetValue(BUFFER, DOUBLE);
MyViewer->Show(Root);
MyViewer2->Show(Root);
return 0;
}