PDA

View Full Version : Camera Path



Micronix-TRSI
17-07-2020, 09:47 PM
OpenGL code for simple game-setup

You can control a player [blue triangle] with keyboard
( w = move forward; d and a = rotate left/right ) like a vehicle.

And there is a enemy-robot-vehicle [yellow triangle] which
follow a path on the playground. ( right now --> linear interpolation )

The Camera can be fixed [ press 6 ], can follow the player [ press 7 ]
or focus the robot [ press 8 ]

Rotate the playground [ press 1 ], change camera distance [ press 1 or 2 ] and camera
position [ press 3 or 4 ]

improvements: other interpolation like Centripetal Catmull-Spline, 3D-movement support, scripted camera, real 3d-Character

1554

Stay tuned.

AthenaOfDelphi
18-07-2020, 08:42 AM
Nice, thanks for posting :)

You wouldn't like to maybe create a little article about the maths involved would you?

de_jean_7777
20-07-2020, 06:15 PM
I tried it, but it runs as though the game loop is not timed (it runs too fast), but only on the integrated graphics. And if you click it'll crash. On a win 10 with i7-6700hq and Intel HD 530 graphics. But if I switch to my GTX 950M gpu it runs fine.

JernejL
22-07-2020, 08:55 AM
Here's my contribution, Centripetal Catmul-Rom function - feel free to use it:



const alpha = 0.5; //set from 0-1

type
TCurveSegment = array of Vector;

var
testsegment: TCurveSegment;
outpoints: TCurveSegment;

function interpolateCurve(points: TCurveSegment; var outpoints: TCurveSegment; amountOfPoints: integer): Vector;

implementation

function GetT(t: single; p0: Vector; p1: Vector): single;
var
a, b, c: single;
begin
a := power((p1.x - p0.x), 2.0) + power((p1.y - p0.y), 2.0);
b := power(a, 0.5);
c := power(b, alpha);

result := (c + t);

end;


// todo: to calculate length, use https://en.wikipedia.org/wiki/Arc_length

// Centripetal Catmul-Rom
// https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline

function interpolateCurve(points: TCurveSegment; var outpoints: TCurveSegment; amountOfPoints: integer): Vector;
var
t0, t1, t2, t3: single;
segment_length: single;
t: single;
A1, A2, A3, B1, B2, C: Vector;
begin

t0 := 0.0;
t1 := GetT(t0, points[0], points[1]);
t2 := GetT(t1, points[1], points[2]);
t3 := GetT(t2, points[2], points[3]);

segment_length := ((t2 - t1) / amountOfPoints);

t := t1;

while (true) do
begin

A1.x := (t1 - t) / (t1 - t0) * points[0].x + (t - t0) / (t1 - t0) * points[1].x;
A1.y := (t1 - t) / (t1 - t0) * points[0].y + (t - t0) / (t1 - t0) * points[1].y;

A2.x := (t2 - t) / (t2 - t1) * points[1].x + (t - t1) / (t2 - t1) * points[2].x;
A2.y := (t2 - t) / (t2 - t1) * points[1].y + (t - t1) / (t2 - t1) * points[2].y;

A3.x := (t3 - t) / (t3 - t2) * points[2].x + (t - t2) / (t3 - t2) * points[3].x;
A3.y := (t3 - t) / (t3 - t2) * points[2].y + (t - t2) / (t3 - t2) * points[3].y;

B1.x := (t2 - t) / (t2 - t0) * A1.x + (t - t0) / (t2 - t0) * A2.x;
B1.y := (t2 - t) / (t2 - t0) * A1.y + (t - t0) / (t2 - t0) * A2.y;

B2.x := (t3 - t) / (t3 - t1) * A2.x + (t - t1) / (t3 - t1) * A3.x;
B2.y := (t3 - t) / (t3 - t1) * A2.y + (t - t1) / (t3 - t1) * A3.y;

C.x := (t2 - t) / (t2 - t1) * B1.x + (t - t1) / (t2 - t1) * B2.x;
C.y := (t2 - t) / (t2 - t1) * B1.y + (t - t1) / (t2 - t1) * B2.y;

setlength(outpoints, length(outpoints) + 1);
outpoints[high(outpoints)] := C;

t := t + segment_length;

if not (t < t2) then
break;

end;

end;

initialization

// setlength(testsegment, 4);
//
// testsegment[0]:= makevector2(5,6);
// testsegment[1]:= makevector2(3,4);
// testsegment[2]:= makevector2(3,2);
// testsegment[3]:= makevector2(5,2);
//
// interpolateCurve(testsegment, outpoints, 10);
//
// info(length(outpoints));