Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Added variable height for the boat

  • Loading branch information...
commit 4a2db2ef8d2463d53d9ff820b651d482d43eaa72 1 parent 6395cf4
@gnuvince authored
Showing with 138 additions and 117 deletions.
  1. +135 −117 Application/Sources/Scene/Boat.cpp
  2. +3 −0  Application/Sources/Scene/Boat.h
View
252 Application/Sources/Scene/Boat.cpp
@@ -2,141 +2,159 @@
#include "MainWindow.h"
#include "CoreLib/Cube.h"
-#define BOAT_WIDTH 10
-#define BOAT_THICKNESS 2
-#define BOAT_LENGTH 10
+#define BOAT_WIDTH 5
+#define BOAT_THICKNESS 0.3
+#define BOAT_LENGTH 5
using namespace CoreLib;
namespace Application
{
-Boat::Boat()
-{
- // Parenting
- ///////////////////////////////////////
- // IFT3355
- // Ici, vous devez définir la hiérarchie
- // de l'objet. la class Boat étant elle-même
- // un Node<real> vous pouvez attacher ses
- // sous-objet à l'aide de la méthode this->AddChild(...)
- ///////////////////////////////////////
- Cube<real> *platform = new Cube<real>(BOAT_WIDTH, BOAT_THICKNESS, BOAT_LENGTH);
-
- BlinnPhongMaterial<real> *bpm = new BlinnPhongMaterial<real>;
- Color<real> *red = new Color<real>(1, 0.5, 0, 1);
- bpm->SetSurface(*red);
- platform->SetMaterial(bpm);
-
- this->AddChild(platform);
-
- // Size definition
- ///////////////////////////////////////
- // IFT3355
- // Ici, vous devez définir les grandeurs
- // de chaque objet à l'aide de leur méthode
- // SetSizes(...)
- ///////////////////////////////////////
-
- // Relative transformations
- ///////////////////////////////////////
- // IFT3355
- // Ici, vous devez donner les transformations
- // relatives aux parents en modifiant la
- // transformation locale de chaque noeud. Par exemple,
- // mHull.GetLocalTransformation().SetTranslation(Vector3<real>(1,2,3));
- // Chaque type transformation sera accumulé et sera par après
- // combiné dans l'ordre défini dans la méthode GetMatrix()
- // de la classe Transformation
- ///////////////////////////////////////
-
- // Material definition
- ///////////////////////////////////////
- // IFT3355
- // Voici un exemple de matériau. Vous pouvez
- // vous en créer d'autres au besoin.
- ///////////////////////////////////////
- mHullMaterial.SetSurface( Color<real>( 1, 1, 1, 1.0 ) );
- mHullMaterial.SetSpecular( Color<real>( 0.01, 0.01, 0.01, 1.0 ) );
- mHullMaterial.SetShininess( 128 );
-
- // Material application
- ///////////////////////////////////////
- // IFT3355
- // Appliquer un matériau à chacun des objets par
- // la méthode SetMaterial(...). Il est important
- // d'appliquer un matériau à chaque objet afin
- // que le rendu se fasse correctement! Vous
- // pouvez utiliser le même matériau pour plusieurs
- // objets.
- ///////////////////////////////////////
-}
-
-void Boat::Animate( const WaterSurface& waterSurface, real time, real dt )
-{
- ///////////////////////////////////////
- // IFT3355
- // Ici vous devrez gérer la rotation et
- // la translation dû au mouvement de l'eau.
- // La méthode GetGlobalWithHeight() de la
- // classe parent HeightFieldprend une
- // position dans le repère global en entrée et
- // retourne la même position, mais en ajustant la
- // hauteur pour qu'elle concorde avec la surface
- // de l'eau.
- //
- // Vous devrez aussi gérer le déplacement par
- // les touches du clavier. Pour savoir si un touche
- // est enfoncée, appelez la méthode
- // MainWindow::Get()->IsKeyPressed('a')
- ///////////////////////////////////////
-
+ Boat::Boat()
+ {
+ // Parenting
+ ///////////////////////////////////////
+ // IFT3355
+ // Ici, vous devez définir la hiérarchie
+ // de l'objet. la class Boat étant elle-même
+ // un Node<real> vous pouvez attacher ses
+ // sous-objet à l'aide de la méthode this->AddChild(...)
+ ///////////////////////////////////////
+ Cube<real> *platform = new Cube<real>(BOAT_WIDTH, BOAT_THICKNESS, BOAT_LENGTH);
+
+ BlinnPhongMaterial<real> *bpm = new BlinnPhongMaterial<real>;
+ Color<real> *red = new Color<real>(1, 0.5, 0, 1);
+ bpm->SetSurface(*red);
+ platform->SetMaterial(bpm);
+
+ this->AddChild(platform);
+
+ // Size definition
+ ///////////////////////////////////////
+ // IFT3355
+ // Ici, vous devez définir les grandeurs
+ // de chaque objet à l'aide de leur méthode
+ // SetSizes(...)
+ ///////////////////////////////////////
+
+ // Relative transformations
+ ///////////////////////////////////////
+ // IFT3355
+ // Ici, vous devez donner les transformations
+ // relatives aux parents en modifiant la
+ // transformation locale de chaque noeud. Par exemple,
+ // mHull.GetLocalTransformation().SetTranslation(Vector3<real>(1,2,3));
+ // Chaque type transformation sera accumulé et sera par après
+ // combiné dans l'ordre défini dans la méthode GetMatrix()
+ // de la classe Transformation
+ ///////////////////////////////////////
+
+ // Material definition
+ ///////////////////////////////////////
+ // IFT3355
+ // Voici un exemple de matériau. Vous pouvez
+ // vous en créer d'autres au besoin.
+ ///////////////////////////////////////
+ mHullMaterial.SetSurface( Color<real>( 1, 1, 1, 1.0 ) );
+ mHullMaterial.SetSpecular( Color<real>( 0.01, 0.01, 0.01, 1.0 ) );
+ mHullMaterial.SetShininess( 128 );
+
+ // Material application
+ ///////////////////////////////////////
+ // IFT3355
+ // Appliquer un matériau à chacun des objets par
+ // la méthode SetMaterial(...). Il est important
+ // d'appliquer un matériau à chaque objet afin
+ // que le rendu se fasse correctement! Vous
+ // pouvez utiliser le même matériau pour plusieurs
+ // objets.
+ ///////////////////////////////////////
+ }
+ real Boat::getDeltaYAtPoint(const WaterSurface& waterSurface, Vector3<real> pt) {
+ Vector3<real> global_position = GetLocalToGlobal() * pt;
+ Vector3<real> water_position = waterSurface.GetGlobalWithHeight(global_position);
+ real y_delta = water_position.Y() - global_position.Y();
+ return y_delta;
+ }
- if (MainWindow::Get()->IsKeyPressed('w')) {
+ void Boat::Animate( const WaterSurface& waterSurface, real time, real dt )
+ {
+ ///////////////////////////////////////
+ // IFT3355
+ // Ici vous devrez gérer la rotation et
+ // la translation dû au mouvement de l'eau.
+ // La méthode GetGlobalWithHeight() de la
+ // classe parent HeightFieldprend une
+ // position dans le repère global en entrée et
+ // retourne la même position, mais en ajustant la
+ // hauteur pour qu'elle concorde avec la surface
+ // de l'eau.
+ //
+ // Vous devrez aussi gérer le déplacement par
+ // les touches du clavier. Pour savoir si un touche
+ // est enfoncée, appelez la méthode
+ // MainWindow::Get()->IsKeyPressed('a')
+ ///////////////////////////////////////
+
+
+ real y_average = (getDeltaYAtPoint(waterSurface, Vector3<real>(0, 0, 0))
+ + getDeltaYAtPoint(waterSurface, Vector3<real>(BOAT_WIDTH/2, 0, BOAT_LENGTH/2))
+ + getDeltaYAtPoint(waterSurface, Vector3<real>(BOAT_WIDTH/2, 0, -BOAT_LENGTH/2))
+ + getDeltaYAtPoint(waterSurface, Vector3<real>(-BOAT_WIDTH/2, 0, BOAT_LENGTH/2))
+ + getDeltaYAtPoint(waterSurface, Vector3<real>(-BOAT_WIDTH/2, 0, -BOAT_LENGTH/2))) / 5;
Transformation<real> t = GetLocalTransformation();
- t.Translate(Vector3<real>(cos(angle - PI/2)*-20*dt, 0, -sin(angle - PI/2)*-20*dt));
+ t.Translate(Vector3<real>(0, y_average, 0));
SetLocalTransformation(t);
- }
- if (MainWindow::Get()->IsKeyPressed('s')) {
- Transformation<real> t = GetLocalTransformation();
- t.Translate(Vector3<real>(cos(angle - PI/2)*10*dt, 0, -sin(angle - PI/2)*10*dt));
- SetLocalTransformation(t);
- }
- if (MainWindow::Get()->IsKeyPressed('a')) {
- Transformation<real> t = GetLocalTransformation();
- t.RotateY(dt);
- SetLocalTransformation(t);
- angle += dt;
- }
- if (MainWindow::Get()->IsKeyPressed('d')) {
- Transformation<real> t = GetLocalTransformation();
- t.RotateY(-dt);
- SetLocalTransformation(t);
- angle -= dt;
- }
+ if (MainWindow::Get()->IsKeyPressed('w')) {
+ Transformation<real> t = GetLocalTransformation();
+ t.Translate(Vector3<real>(cos(angle - PI/2)*-20*dt, 0, -sin(angle - PI/2)*-20*dt));
+ SetLocalTransformation(t);
+ }
- UnusedParameter( time );
-}
+ if (MainWindow::Get()->IsKeyPressed('s')) {
+ Transformation<real> t = GetLocalTransformation();
+ t.Translate(Vector3<real>(cos(angle - PI/2)*10*dt, 0, -sin(angle - PI/2)*10*dt));
+ SetLocalTransformation(t);
+ }
-real Boat::GetSizeZ() const
-{
- // Vous pouvez remplacer cette valeur au besoin.
- //Elle doit correspondre à la taille de la coque du bateau
- return BOAT_LENGTH;
-}
+ if (MainWindow::Get()->IsKeyPressed('a')) {
+ Transformation<real> t = GetLocalTransformation();
+ t.RotateY(dt);
+ SetLocalTransformation(t);
+ angle += dt;
+ }
-real Boat::GetSizeX() const
-{
- // Vous pouvez remplacer cette valeur au besoin.
- //Elle doit correspondre à la taille de la coque du bateau
- return BOAT_WIDTH;
-}
+ if (MainWindow::Get()->IsKeyPressed('d')) {
+ Transformation<real> t = GetLocalTransformation();
+ t.RotateY(-dt);
+ SetLocalTransformation(t);
+ angle -= dt;
+ }
+
+
+ UnusedParameter( time );
+ }
+
+ real Boat::GetSizeZ() const
+ {
+ // Vous pouvez remplacer cette valeur au besoin.
+ //Elle doit correspondre à la taille de la coque du bateau
+ return BOAT_LENGTH;
+ }
+
+ real Boat::GetSizeX() const
+ {
+ // Vous pouvez remplacer cette valeur au besoin.
+ //Elle doit correspondre à la taille de la coque du bateau
+ return BOAT_WIDTH;
+ }
}
View
3  Application/Sources/Scene/Boat.h
@@ -8,6 +8,7 @@
#include "CoreLib/Cube.h"
#include "CoreLib/Cylinder.h"
#include "CoreLib/Node.h"
+#include "CoreLib/Vector3.h"
namespace Application
{
@@ -27,6 +28,8 @@ class Boat : public CoreLib::Node<real>
CoreLib::BlinnPhongMaterial<real> mHullMaterial;
real angle;
+
+ real getDeltaYAtPoint(const WaterSurface&, CoreLib::Vector3<real>);
};
}
Please sign in to comment.
Something went wrong with that request. Please try again.