Improved coordinate handling
This commit is contained in:
parent
7cb2fd2e24
commit
c1dfe5c80e
7 changed files with 62 additions and 58 deletions
21
src/coordinates/coordinate_transformer.cpp
Normal file
21
src/coordinates/coordinate_transformer.cpp
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#include "coordinate_transformer.h"
|
||||||
|
|
||||||
|
// Initialize matrix
|
||||||
|
const Eigen::Matrix<float, 3, 3> CoordinateTransformer::worldToIsometricMatrix =
|
||||||
|
(Eigen::Matrix<float, 3, 3>() << 0.5f, 0.5f, 0,
|
||||||
|
-0.5f, 0.5f, -1,
|
||||||
|
1, 1, 0).finished();
|
||||||
|
|
||||||
|
IsometricCoordinates CoordinateTransformer::worldToIsometric(WorldCoordinates worldCoordinates)
|
||||||
|
{
|
||||||
|
Eigen::Vector3f worldCoordinatesVector;
|
||||||
|
worldCoordinatesVector << worldCoordinates.x, worldCoordinates.y, worldCoordinates.z;
|
||||||
|
|
||||||
|
Eigen::Vector3f isoCoordinatesVector = worldToIsometricMatrix * worldCoordinatesVector;
|
||||||
|
|
||||||
|
return IsometricCoordinates(
|
||||||
|
isoCoordinatesVector.x(), // x
|
||||||
|
isoCoordinatesVector.y(), // y
|
||||||
|
isoCoordinatesVector.z() // depth
|
||||||
|
);
|
||||||
|
}
|
17
src/coordinates/coordinate_transformer.h
Normal file
17
src/coordinates/coordinate_transformer.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef HOLESOME_COORDINATE_TRANSFORMER_H
|
||||||
|
#define HOLESOME_COORDINATE_TRANSFORMER_H
|
||||||
|
|
||||||
|
#include <Eigen/Dense>
|
||||||
|
#include "coordinates.h"
|
||||||
|
|
||||||
|
class CoordinateTransformer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static const Eigen::Matrix<float, 3, 3> worldToIsometricMatrix;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static IsometricCoordinates worldToIsometric(WorldCoordinates worldCoordinates);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //HOLESOME_COORDINATE_TRANSFORMER_H
|
|
@ -5,12 +5,14 @@
|
||||||
#ifndef HOLESOME_COORDINATES_H
|
#ifndef HOLESOME_COORDINATES_H
|
||||||
#define HOLESOME_COORDINATES_H
|
#define HOLESOME_COORDINATES_H
|
||||||
|
|
||||||
struct WorldCoordinates {
|
struct WorldCoordinates
|
||||||
|
{
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z; // Height
|
float z; // Height
|
||||||
|
|
||||||
WorldCoordinates operator+(WorldCoordinates other) const {
|
WorldCoordinates operator+(WorldCoordinates other) const
|
||||||
|
{
|
||||||
return {
|
return {
|
||||||
x + other.x,
|
x + other.x,
|
||||||
y + other.y,
|
y + other.y,
|
||||||
|
@ -18,11 +20,13 @@ struct WorldCoordinates {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldCoordinates operator-(WorldCoordinates other) const {
|
WorldCoordinates operator-(WorldCoordinates other) const
|
||||||
|
{
|
||||||
return (*this) + (other * -1);
|
return (*this) + (other * -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldCoordinates operator*(float factor) const {
|
WorldCoordinates operator*(float factor) const
|
||||||
|
{
|
||||||
return {
|
return {
|
||||||
x * factor,
|
x * factor,
|
||||||
y * factor,
|
y * factor,
|
||||||
|
@ -30,25 +34,31 @@ struct WorldCoordinates {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldCoordinates operator/(float factor) const {
|
WorldCoordinates operator/(float factor) const
|
||||||
|
{
|
||||||
return (*this) * (1 / factor);
|
return (*this) * (1 / factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(WorldCoordinates other) const {
|
bool operator==(WorldCoordinates other) const
|
||||||
|
{
|
||||||
return x == other.x && y == other.y && z == other.z;
|
return x == other.x && y == other.y && z == other.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator!=(WorldCoordinates other) const {
|
bool operator!=(WorldCoordinates other) const
|
||||||
|
{
|
||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScreenCoordinates {
|
struct IsometricCoordinates
|
||||||
|
{
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
|
float depth; // Bigger means further back. Can be used for accurate rendering order.
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GridCoordinates {
|
struct GridCoordinates
|
||||||
|
{
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
//
|
|
||||||
// Created by max on 27.04.23.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "isometric_coordinate_transformer.h"
|
|
||||||
|
|
||||||
IsometricCoordinateTransformer::IsometricCoordinateTransformer() {
|
|
||||||
worldToScreenMatrix = Eigen::Matrix<float, 2, 3>();
|
|
||||||
worldToScreenMatrix << 0.5f, 0.5f, 0,
|
|
||||||
-0.5f, 0.5f, -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScreenCoordinates IsometricCoordinateTransformer::worldToScreen(WorldCoordinates worldCoordinates) const {
|
|
||||||
Eigen::Vector3f worldCoordinatesVector;
|
|
||||||
worldCoordinatesVector << worldCoordinates.x, worldCoordinates.y, worldCoordinates.z;
|
|
||||||
|
|
||||||
Eigen::Vector2f screenCoordinatesVector = worldToScreenMatrix * worldCoordinatesVector;
|
|
||||||
|
|
||||||
return {
|
|
||||||
screenCoordinatesVector.x(),
|
|
||||||
screenCoordinatesVector.y()
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
//
|
|
||||||
// Created by max on 27.04.23.struct
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef HOLESOME_ISOMETRIC_COORDINATE_TRANSFORMER_H
|
|
||||||
#define HOLESOME_ISOMETRIC_COORDINATE_TRANSFORMER_H
|
|
||||||
|
|
||||||
#include <Eigen/Dense>
|
|
||||||
#include "coordinates.h"
|
|
||||||
|
|
||||||
class IsometricCoordinateTransformer {
|
|
||||||
private:
|
|
||||||
Eigen::Matrix<float, 2, 3> worldToScreenMatrix;
|
|
||||||
|
|
||||||
public:
|
|
||||||
IsometricCoordinateTransformer();
|
|
||||||
ScreenCoordinates worldToScreen(WorldCoordinates worldCoordinates) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //HOLESOME_ISOMETRIC_COORDINATE_TRANSFORMER_H
|
|
|
@ -8,8 +8,8 @@ WorldCoordinates TranslatedCoordinates::getWorldCoordinates() const {
|
||||||
return worldCoordinates;
|
return worldCoordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenCoordinates TranslatedCoordinates::getScreenCoordinates() const {
|
IsometricCoordinates TranslatedCoordinates::getScreenCoordinates() const {
|
||||||
return isoCoordTransformer->worldToScreen(worldCoordinates);
|
return isoCoordTransformer->worldToIsometric(worldCoordinates);
|
||||||
}
|
}
|
||||||
|
|
||||||
GridCoordinates TranslatedCoordinates::getGridCoordinates() const {
|
GridCoordinates TranslatedCoordinates::getGridCoordinates() const {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "coordinates.h"
|
#include "coordinates.h"
|
||||||
#include "isometric_coordinate_transformer.h"
|
#include "coordinate_transformer.h"
|
||||||
|
|
||||||
#define INITIAL_WORLD_TO_GRID_FACTOR 0.25f
|
#define INITIAL_WORLD_TO_GRID_FACTOR 0.25f
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ public:
|
||||||
|
|
||||||
WorldCoordinates getWorldCoordinates() const;
|
WorldCoordinates getWorldCoordinates() const;
|
||||||
|
|
||||||
ScreenCoordinates getScreenCoordinates() const;
|
IsometricCoordinates getScreenCoordinates() const;
|
||||||
|
|
||||||
GridCoordinates getGridCoordinates() const;
|
GridCoordinates getGridCoordinates() const;
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ public:
|
||||||
private:
|
private:
|
||||||
WorldCoordinates worldCoordinates;
|
WorldCoordinates worldCoordinates;
|
||||||
const float worldToGridFactor = INITIAL_WORLD_TO_GRID_FACTOR;
|
const float worldToGridFactor = INITIAL_WORLD_TO_GRID_FACTOR;
|
||||||
const std::shared_ptr<IsometricCoordinateTransformer> isoCoordTransformer = std::make_shared<IsometricCoordinateTransformer>();
|
const std::shared_ptr<CoordinateTransformer> isoCoordTransformer = std::make_shared<CoordinateTransformer>();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue