boids
This commit is contained in:
parent
b66ffaf1d5
commit
9bff8a1d0d
@ -23,6 +23,7 @@
|
|||||||
<ClCompile Include="src\Texture.cpp" />
|
<ClCompile Include="src\Texture.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="src\boids.h" />
|
||||||
<ClInclude Include="src\Camera.h" />
|
<ClInclude Include="src\Camera.h" />
|
||||||
<ClInclude Include="src\ex_9_1.hpp" />
|
<ClInclude Include="src\ex_9_1.hpp" />
|
||||||
<ClInclude Include="src\objload.h" />
|
<ClInclude Include="src\objload.h" />
|
||||||
|
@ -53,21 +53,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\objload.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\Render_Utils.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\Shader_Loader.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\Camera.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\Texture.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\SOIL\image_helper.h">
|
<ClInclude Include="src\SOIL\image_helper.h">
|
||||||
<Filter>Source Files\SOIL</Filter>
|
<Filter>Source Files\SOIL</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -86,8 +71,26 @@
|
|||||||
<ClInclude Include="src\SOIL\image_DXT.h">
|
<ClInclude Include="src\SOIL\image_DXT.h">
|
||||||
<Filter>Source Files\SOIL</Filter>
|
<Filter>Source Files\SOIL</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Camera.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\objload.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Shader_Loader.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Texture.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Render_Utils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="src\ex_9_1.hpp">
|
<ClInclude Include="src\ex_9_1.hpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\boids.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
70
cw 9/src/Fish.cpp
Normal file
70
cw 9/src/Fish.cpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "Fish.h"
|
||||||
|
#include "Texture1.h"
|
||||||
|
#include "Rectangle.h"
|
||||||
|
#include "glm.hpp"
|
||||||
|
#include "glew.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
Fish::Fish(const glm::vec3& position, const glm::vec3& velocity, Texture* texture)
|
||||||
|
: m_position(position), m_velocity(velocity), m_texture(texture), m_bounds() {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Fish::Update(const std::vector<Fish>& neighbors, const glm::vec3& target, float dt) {
|
||||||
|
// W tej funkcji nale¿y zaimplementowaæ algorytm boid.
|
||||||
|
// neighbors jest wektorem s¹siaduj¹cych ryb.
|
||||||
|
// target jest pozycj¹ drapie¿nika, dt jest ró¿nic¹ czasu miêdzy aktualnym i poprzednim klatkami.
|
||||||
|
|
||||||
|
// Pozycja ryby jest aktualizowana na podstawie algorytmu boid.
|
||||||
|
|
||||||
|
glm::vec3 average_position(0.0f, 0.0f, 0.0f);
|
||||||
|
glm::vec3 average_velocity(0.0f, 0.0f, 0.0f);
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (const Fish& neighbor : neighbors) {
|
||||||
|
if (&neighbor == this) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
average_position += neighbor.m_position;
|
||||||
|
average_velocity += neighbor.m_velocity;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
average_position /= count;
|
||||||
|
average_velocity /= count;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 center = m_bounds.m_min + (m_bounds.m_max - m_bounds.m_min) * 0.5f;
|
||||||
|
glm::vec3 avoid = m_position - center;
|
||||||
|
|
||||||
|
m_velocity += (average_position - m_position) * 0.05f +
|
||||||
|
(average_velocity - m_velocity) * 0.05f +
|
||||||
|
avoid * 0.05f;
|
||||||
|
|
||||||
|
if (target != glm::vec3(0.0f, 0.0f, 0.0f)) {
|
||||||
|
m_velocity += (target - m_position) * 0.05f;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_velocity = glm::normalize(m_velocity);
|
||||||
|
m_position += m_velocity * dt;
|
||||||
|
|
||||||
|
// Ograniczenie pozycji ryby do prostok¹ta.
|
||||||
|
m_position.x = glm::clamp(m_position.x, m_bounds.m_min.x, m_bounds.m_max.x);
|
||||||
|
m_position.y = glm::clamp(m_position.y, m_bounds.m_min.y, m_bounds.m_max.y);
|
||||||
|
m_position.z = glm::clamp(m_position.z, m_bounds.m_min.z, m_bounds.m_max.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fish::Render() const { // W tej funkcji nale¿y zrenderowaæ teksturê ryby w odpowiedniej pozycji. // Mo¿na to zrobiæ na przyk³ad za pomoc¹ biblioteki OpenGL.
|
||||||
|
|
||||||
|
glm::mat4 model(1.0f); model = glm::translate(model, m_position);
|
||||||
|
|
||||||
|
GLuint model_location = glGetUniformLocation(m_shader_program, "model"); glUniformMatrix4fv(model_location, 1, GL_FALSE, &model[0][0]);
|
||||||
|
|
||||||
|
GLuint texture_location = glGetUniformLocation(m_shader_program, "texture_sampler"); glUniform1i(texture_location, 0);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_texture.m_id);
|
||||||
|
|
||||||
|
glBindVertexArray(m_vao); glDrawArrays(GL_TRIANGLES, 0, m_vertex_count); glBindVertexArray(0);
|
||||||
|
}
|
21
cw 9/src/Fish.h
Normal file
21
cw 9/src/Fish.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "glm.hpp"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Texture;
|
||||||
|
|
||||||
|
class Fish {
|
||||||
|
public:
|
||||||
|
Fish::Fish(const glm::vec3& position, const glm::vec3& velocity, Texture* texture);
|
||||||
|
|
||||||
|
|
||||||
|
void Update(const std::vector<Fish>& neighbors, const glm::vec3& target, float dt);
|
||||||
|
void Render();
|
||||||
|
|
||||||
|
private:
|
||||||
|
glm::vec3 m_position;
|
||||||
|
glm::vec3 m_velocity;
|
||||||
|
Texture* m_texture;
|
||||||
|
Rectangle m_bounds;
|
||||||
|
};
|
13
cw 9/src/Predator.h
Normal file
13
cw 9/src/Predator.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "glm.hpp"
|
||||||
|
|
||||||
|
class Predator {
|
||||||
|
public:
|
||||||
|
Predator(const glm::vec3& position);
|
||||||
|
|
||||||
|
void Render();
|
||||||
|
|
||||||
|
private:
|
||||||
|
glm::vec3 m_position;
|
||||||
|
};
|
13
cw 9/src/Rectangle.h
Normal file
13
cw 9/src/Rectangle.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "glm.hpp"
|
||||||
|
|
||||||
|
class Rectangle {
|
||||||
|
public:
|
||||||
|
Rectangle(const glm::vec3& min = glm::vec3(0), const glm::vec3& max = glm::vec3(1));
|
||||||
|
|
||||||
|
bool Contains(const glm::vec3& point) const;
|
||||||
|
|
||||||
|
glm::vec3 m_min;
|
||||||
|
glm::vec3 m_max;
|
||||||
|
};
|
14
cw 9/src/Texture1.h
Normal file
14
cw 9/src/Texture1.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "glm.hpp"
|
||||||
|
|
||||||
|
class Rectangle {
|
||||||
|
public:
|
||||||
|
Rectangle(const glm::vec3& min, const glm::vec3& max);
|
||||||
|
|
||||||
|
bool Contains(const glm::vec3& point) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
glm::vec3 m_min;
|
||||||
|
glm::vec3 m_max;
|
||||||
|
};
|
130
cw 9/src/boids.h
Normal file
130
cw 9/src/boids.h
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/*#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <glut.h>
|
||||||
|
|
||||||
|
|
||||||
|
//const int WIDTH = 500;
|
||||||
|
//const int HEIGHT = 500;
|
||||||
|
const int DEPTH = 600;
|
||||||
|
const int NUM_BOIDS = 100;
|
||||||
|
const float BOID_SPEED = 0.01f;
|
||||||
|
const float BOID_SIZE = 0.50f;
|
||||||
|
|
||||||
|
struct Boid
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
float dx, dy, dz;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Boid> boids;
|
||||||
|
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
Boid b;
|
||||||
|
b.x = float(rand()) / RAND_MAX * 2 - 1;
|
||||||
|
b.y = float(rand()) / RAND_MAX * 2 - 1;
|
||||||
|
b.z = float(rand()) / RAND_MAX * 2 - 1;
|
||||||
|
b.dx = float(rand()) / RAND_MAX * BOID_SPEED - BOID_SPEED / 2;
|
||||||
|
b.dy = float(rand()) / RAND_MAX * BOID_SPEED - BOID_SPEED / 2;
|
||||||
|
b.dz = float(rand()) / RAND_MAX * BOID_SPEED - BOID_SPEED / 2;
|
||||||
|
boids.push_back(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateBoids()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
Boid& b1 = boids[i];
|
||||||
|
float avgX = 0;
|
||||||
|
float avgY = 0;
|
||||||
|
float avgZ = 0;
|
||||||
|
int count = 0;
|
||||||
|
for (int j = 0; j < NUM_BOIDS; j++)
|
||||||
|
{
|
||||||
|
if (i == j)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Boid& b2 = boids[j];
|
||||||
|
float dx = b2.x - b1.x;
|
||||||
|
float dy = b2.y - b1.y;
|
||||||
|
float dz = b2.z - b1.z;
|
||||||
|
float distance = sqrt(dx * dx + dy * dy + dz * dz);
|
||||||
|
if (distance < BOID_SIZE)
|
||||||
|
{
|
||||||
|
b1.dx -= dx / NUM_BOIDS;
|
||||||
|
b1.dy -= dy / NUM_BOIDS;
|
||||||
|
b1.dz -= dz / NUM_BOIDS;
|
||||||
|
}
|
||||||
|
avgX += b2.dx;
|
||||||
|
avgY += b2.dy;
|
||||||
|
avgZ += b2.dz;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
avgX /= count;
|
||||||
|
avgY /= count;
|
||||||
|
avgZ /= count;
|
||||||
|
b1.dx += avgX / NUM_BOIDS;
|
||||||
|
b1.dy += avgY / NUM_BOIDS;
|
||||||
|
b1.dz += avgZ / NUM_BOIDS;
|
||||||
|
|
||||||
|
b1.x += b1.dx;
|
||||||
|
b1.y += b1.dy;
|
||||||
|
b1.z += b1.dz;
|
||||||
|
|
||||||
|
if (b1.x < 0 || b1.x > 1)
|
||||||
|
b1.dx *= -1;
|
||||||
|
if (b1.y < 0 || b1.y > 1)
|
||||||
|
b1.dy *= -1;
|
||||||
|
if (b1.z < 0 || b1.z > 1)
|
||||||
|
b1.dz *= -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void renderBoids()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
glBegin(GL_POINTS);
|
||||||
|
glVertex3f(boids[i].x, boids[i].y, boids[i].z);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
void display()
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
|
||||||
|
updateBoids();
|
||||||
|
renderBoids();
|
||||||
|
glutSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void reshape(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(60, float(width) / height, 1, 100);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
glutInit(&argc, argv);
|
||||||
|
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
|
||||||
|
glutInitWindowSize(WIDTH, HEIGHT);
|
||||||
|
glutCreateWindow("Boids");
|
||||||
|
glutDisplayFunc(display);
|
||||||
|
glutReshapeFunc(reshape);
|
||||||
|
glutIdleFunc(display);
|
||||||
|
init();
|
||||||
|
glutMainLoop();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
@ -15,6 +15,19 @@
|
|||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
#include <assimp/postprocess.h>
|
#include <assimp/postprocess.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <glut.h>
|
||||||
|
|
||||||
|
|
||||||
|
const int DEPTH = 100;
|
||||||
|
const int NUM_BOIDS = 20;
|
||||||
|
const float BOID_SIZE = 0.05f;
|
||||||
|
const float MAX_SPEED = 0.02f;
|
||||||
|
const float NEIGHBOR_RADIUS = 0.1f;
|
||||||
|
const float SEPARATION_WEIGHT = 1.0f;
|
||||||
|
const float ALIGNMENT_WEIGHT = 1.0f;
|
||||||
|
const float COHESION_WEIGHT = 1.0f;
|
||||||
|
|
||||||
//const unsigned int SHADOW_WIDTH = 16384, SHADOW_HEIGHT = 16384;
|
//const unsigned int SHADOW_WIDTH = 16384, SHADOW_HEIGHT = 16384;
|
||||||
const unsigned int SHADOW_WIDTH = 2048, SHADOW_HEIGHT = 2048;
|
const unsigned int SHADOW_WIDTH = 2048, SHADOW_HEIGHT = 2048;
|
||||||
@ -220,6 +233,8 @@ bool animal_in_aquarium = false;
|
|||||||
float lastTime = -1.f;
|
float lastTime = -1.f;
|
||||||
float deltaTime = 0.f;
|
float deltaTime = 0.f;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void updateDeltaTime(float time) {
|
void updateDeltaTime(float time) {
|
||||||
if (lastTime < 0) {
|
if (lastTime < 0) {
|
||||||
lastTime = time;
|
lastTime = time;
|
||||||
@ -230,6 +245,136 @@ void updateDeltaTime(float time) {
|
|||||||
if (deltaTime > 0.1) deltaTime = 0.1;
|
if (deltaTime > 0.1) deltaTime = 0.1;
|
||||||
lastTime = time;
|
lastTime = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct Boid
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
float vx, vy, vz;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Boid> boids;
|
||||||
|
|
||||||
|
void initBoids()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
Boid b;
|
||||||
|
//b.x = float(rand()) / RAND_MAX * 2 - 1;
|
||||||
|
b.x = 12;
|
||||||
|
b.y = 1;
|
||||||
|
b.z = 4;
|
||||||
|
b.vx = ((float)rand() / RAND_MAX) * MAX_SPEED * 2.0f - MAX_SPEED;
|
||||||
|
b.vy = ((float)rand() / RAND_MAX) * MAX_SPEED * 2.0f - MAX_SPEED;
|
||||||
|
b.vz = ((float)rand() / RAND_MAX) * MAX_SPEED * 2.0f - MAX_SPEED;
|
||||||
|
boids.push_back(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void updateBoid(Boid& b) {
|
||||||
|
float separationX = 0.0f, separationY = 0.0f, separationZ = 0.0f;
|
||||||
|
float alignmentX = 0.0f, alignmentY = 0.0f, alignmentZ = 0.0f;
|
||||||
|
float cohesionX = 0.0f, cohesionY = 0.0f, cohesionZ = 0.0f;
|
||||||
|
int numNeighbors = 0;
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++) {
|
||||||
|
Boid b2 = boids[i];
|
||||||
|
float dx = b.x - b2.x;
|
||||||
|
float dy = b.y - b2.y;
|
||||||
|
float dz = b.z - b2.z;
|
||||||
|
float dist = sqrt(dx * dx + dy * dy + dz * dz);
|
||||||
|
if (dist > 0.0f && dist < NEIGHBOR_RADIUS) {
|
||||||
|
numNeighbors++;
|
||||||
|
separationX += dx / dist;
|
||||||
|
separationY += dy / dist;
|
||||||
|
separationZ += dz / dist;
|
||||||
|
alignmentX += b2.vx;
|
||||||
|
alignmentY += b2.vy;
|
||||||
|
alignmentZ += b2.vz;
|
||||||
|
cohesionX += b2.x;
|
||||||
|
cohesionY += b2.y;
|
||||||
|
cohesionZ += b2.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (numNeighbors > 0) {
|
||||||
|
separationX /= (float)numNeighbors;
|
||||||
|
separationY /= (float)numNeighbors;
|
||||||
|
separationZ /= (float)numNeighbors;
|
||||||
|
alignmentX /= (float)numNeighbors;
|
||||||
|
alignmentY /= (float)numNeighbors;
|
||||||
|
alignmentZ /= (float)numNeighbors;
|
||||||
|
cohesionX /= (float)numNeighbors;
|
||||||
|
cohesionY /= (float)numNeighbors;
|
||||||
|
cohesionZ /= (float)numNeighbors;
|
||||||
|
separationX = separationX * SEPARATION_WEIGHT;
|
||||||
|
separationY = separationY * SEPARATION_WEIGHT;
|
||||||
|
separationZ = separationZ * SEPARATION_WEIGHT;
|
||||||
|
alignmentX = alignmentX * ALIGNMENT_WEIGHT;
|
||||||
|
alignmentY = alignmentY * ALIGNMENT_WEIGHT;
|
||||||
|
alignmentZ = alignmentZ * ALIGNMENT_WEIGHT;
|
||||||
|
cohesionX = (cohesionX / (float)numNeighbors - b.x) * COHESION_WEIGHT;
|
||||||
|
cohesionY = (cohesionY / (float)numNeighbors - b.y) * COHESION_WEIGHT;
|
||||||
|
cohesionZ = (cohesionZ / (float)numNeighbors - b.z) * COHESION_WEIGHT;
|
||||||
|
|
||||||
|
b.vx += separationX + alignmentX + cohesionX;
|
||||||
|
b.vy += separationY + alignmentY + cohesionY;
|
||||||
|
b.vz += separationZ + alignmentZ + cohesionZ;
|
||||||
|
|
||||||
|
float speed = sqrt(b.vx * b.vx + b.vy * b.vy + b.vz * b.vz);
|
||||||
|
if (speed > MAX_SPEED) {
|
||||||
|
b.vx = b.vx / speed * MAX_SPEED;
|
||||||
|
b.vy = b.vy / speed * MAX_SPEED;
|
||||||
|
b.vz = b.vz / speed * MAX_SPEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b.x += b.vx;
|
||||||
|
b.y += b.vy;
|
||||||
|
b.z += b.vz;
|
||||||
|
|
||||||
|
if (b.x < -1.0f) {
|
||||||
|
b.vx = abs(b.vx);
|
||||||
|
}
|
||||||
|
if (b.x > 4.0f) {
|
||||||
|
b.vx = -abs(b.vx);
|
||||||
|
}
|
||||||
|
if (b.y < -1.0f) {
|
||||||
|
b.vy = abs(b.vy);
|
||||||
|
}
|
||||||
|
if (b.y > 4.0f) {
|
||||||
|
b.vy = -abs(b.vy);
|
||||||
|
}
|
||||||
|
if (b.z < -1.0f) {
|
||||||
|
b.vz = abs(b.vz);
|
||||||
|
}
|
||||||
|
if (b.z > 5.0f) {
|
||||||
|
b.vz = -abs(b.vz);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
void renderBoids()
|
||||||
|
{
|
||||||
|
float time = glfwGetTime();
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
float x = boids[i].x;
|
||||||
|
float y = boids[i].y;
|
||||||
|
float z = boids[i].z;
|
||||||
|
|
||||||
|
drawObjectPBRWithTexture(models::fish2Context,
|
||||||
|
glm::translate(glm::vec3(3.f, 1.0f, 0.45f))
|
||||||
|
* glm::rotate(glm::radians(sin(time / 2) * 5.0f), glm::vec3(1.0f, 0.0f, 0.0f))
|
||||||
|
* glm::eulerAngleY(time - 12) * glm::translate(glm::vec3(1.2f, 0, 0))
|
||||||
|
* glm::scale(glm::vec3(0.2f)) * glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0, 1, 0)),
|
||||||
|
texture::fishBlueTexture,
|
||||||
|
0.5f, 0.0f, 0);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
glm::mat4 createCameraMatrix()
|
glm::mat4 createCameraMatrix()
|
||||||
{
|
{
|
||||||
glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir,glm::vec3(0.f,1.f,0.f)));
|
glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir,glm::vec3(0.f,1.f,0.f)));
|
||||||
@ -446,8 +591,24 @@ void renderShadowapSun(GLuint depthMapFBO, glm::mat4 lightVP) {
|
|||||||
* glm::eulerAngleY(time - 11) * glm::translate(glm::vec3(1.2f, 0, 0))
|
* glm::eulerAngleY(time - 11) * glm::translate(glm::vec3(1.2f, 0, 0))
|
||||||
* glm::scale(glm::vec3(0.2f)) * glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0, 1, 0))
|
* glm::scale(glm::vec3(0.2f)) * glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0, 1, 0))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
float x = boids[i].x;
|
||||||
|
float y = boids[i].y;
|
||||||
|
float z = boids[i].z;
|
||||||
|
|
||||||
|
drawObjectDepth(models::fish2Context, lightVP,
|
||||||
|
glm::translate(glm::vec3(x, y, z))
|
||||||
|
//*glm::rotate(glm::radians(sin(time / 2 + 23) * 5.0f), glm::vec3(1.0f, 0.0f, 0.0f))
|
||||||
|
//* glm::eulerAngleY(time - 11)* glm::translate(glm::vec3(1.2f, 0, 0))
|
||||||
|
//* glm::scale(glm::vec3(0.2f))* glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0, 1, 0))
|
||||||
|
);
|
||||||
|
}
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
glViewport(0, 0, WIDTH, HEIGHT);
|
glViewport(0, 0, WIDTH, HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,13 +843,29 @@ void renderScene(GLFWwindow* window)
|
|||||||
drawObjectPBRWithTexture(models::aquariumContext, glm::mat4(), texture::aquariumTexture, 0.8f, 0.0f, 5);
|
drawObjectPBRWithTexture(models::aquariumContext, glm::mat4(), texture::aquariumTexture, 0.8f, 0.0f, 5);
|
||||||
drawObjectPBRWithTexture(models::glassWindowContext, glm::mat4(), texture::glassWallTexture, 0.5f, 0.0f, 5);
|
drawObjectPBRWithTexture(models::glassWindowContext, glm::mat4(), texture::glassWallTexture, 0.5f, 0.0f, 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
float x = boids[i].x;
|
||||||
|
float y = boids[i].y;
|
||||||
|
float z = boids[i].z;
|
||||||
|
|
||||||
|
drawObjectPBRWithTexture(models::fish2Context,
|
||||||
|
glm::translate(glm::vec3(x, y, z)),
|
||||||
|
//* glm::rotate(glm::radians(sin(time / 2) * 5.0f), glm::vec3(1.0f, 0.0f, 0.0f))
|
||||||
|
//* glm::eulerAngleY(time - 12) * glm::translate(glm::vec3(1.2f, 0, 0))
|
||||||
|
//* glm::scale(glm::vec3(0.2f)) * glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0, 1, 0)),
|
||||||
|
texture::fishGreenTexture,
|
||||||
|
0.5f, 0.0f, 0);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < NUM_BOIDS; i++) {
|
||||||
|
updateBoid(boids[i]);
|
||||||
|
}
|
||||||
//Terraingen();
|
//Terraingen();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//test depth buffer
|
//test depth buffer
|
||||||
/*glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
/*glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glUseProgram(programTest);
|
glUseProgram(programTest);
|
||||||
@ -700,6 +877,8 @@ void renderScene(GLFWwindow* window)
|
|||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
aspectRatio = width / float(height);
|
aspectRatio = width / float(height);
|
||||||
@ -985,9 +1164,18 @@ void processInput(GLFWwindow* window)
|
|||||||
void renderLoop(GLFWwindow* window) {
|
void renderLoop(GLFWwindow* window) {
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
|
//glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
//updateBoids();
|
||||||
|
//renderBoids();
|
||||||
|
|
||||||
|
//glfwSwapBuffers(window);
|
||||||
processInput(window);
|
processInput(window);
|
||||||
renderScene(window);
|
renderScene(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//}
|
//}
|
@ -39,9 +39,8 @@ int main(int argc, char** argv)
|
|||||||
glViewport(0, 0, 500, 500);
|
glViewport(0, 0, 500, 500);
|
||||||
|
|
||||||
init(window);
|
init(window);
|
||||||
|
initBoids();
|
||||||
// uruchomienie glownej petli
|
// uruchomienie glownej petli
|
||||||
|
|
||||||
renderLoop(window);
|
renderLoop(window);
|
||||||
|
|
||||||
shutdown(window);
|
shutdown(window);
|
||||||
|
Loading…
Reference in New Issue
Block a user