fix random camera movement on first frame after mouse movement

This commit is contained in:
catangent 2025-04-16 10:53:50 +01:00
parent e805891885
commit a163dcaedd
2 changed files with 9 additions and 6 deletions

View file

@ -25,7 +25,6 @@ pub fn build(b: *std.Build) void {
exe.linkLibrary(rl.artifact("raylib"));
exe.root_module.addImport("znoise", znoise.module("root"));
exe.root_module.addIncludePath(b.path("raylib/src"));
exe.root_module.addIncludePath(b.path("src/c"));
exe.linkLibrary(znoise.artifact("FastNoiseLite"));
@ -49,6 +48,7 @@ pub fn build(b: *std.Build) void {
exe_unit_tests.linkLibrary(rl.artifact("raylib"));
exe_unit_tests.root_module.addImport("znoise", znoise.module("root"));
exe_unit_tests.linkLibrary(znoise.artifact("FastNoiseLite"));
exe_unit_tests.root_module.addIncludePath(b.path("src/c"));
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);

View file

@ -50,9 +50,9 @@ pub fn main() !void {
raylib.SetWindowState(raylib.FLAG_FULLSCREEN_MODE);
var camera = raylib.Camera3D{
.position = raylib.Vector3{ .x = 0, .y = 23, .z = 0 },
.position = raylib.Vector3{ .x = 0, .y = 8, .z = 20 },
.up = raylib.Vector3{ .x = 0, .y = 1, .z = 0 },
.target = raylib.Vector3{ .x = 0, .y = 23-0.707, .z = 0.707 },
.target = raylib.Vector3{ .x = 0, .y = 8, .z = 19 },
.fovy = 45,
.projection = raylib.CAMERA_PERSPECTIVE,
};
@ -117,7 +117,7 @@ pub fn main() !void {
raylib.ClearBackground(raylib.BLACK);
const right = v3.neg(v3.nor(v3.cross(camera.up, v3.sub(camera.target, camera.position))));
const forward = v3.cross(right, v3.new(0, -1, 0));
const forward = v3.cross(right, v3.neg(camera.up));
const speed = @as(f32, if (raylib.IsKeyDown(raylib.KEY_LEFT_CONTROL)) 25 else 5) * raylib.GetFrameTime();
var movement = v3.new(0, 0, 0);
@ -133,8 +133,11 @@ pub fn main() !void {
moveCamera(&camera, v3.scl(v3.nor(movement), speed));
const delta = raylib.GetMouseDelta();
camera.target = v3.add(camera.position, v3.rotate(v3.sub(camera.target, camera.position), v3.new(0, 1, 0), -0.005 * delta.x));
camera.target = v3.add(camera.position, v3.rotate(v3.sub(camera.target, camera.position), right, -0.005 * delta.y));
// on the first mouse movement, for some reason mouse delta is completely insane, so we just ignore too large deltas
if(delta.x < 1000 and delta.y < 1000 and delta.x > -1000 and delta.y > -1000){
camera.target = v3.add(camera.position, v3.rotate(v3.sub(camera.target, camera.position), camera.up, -0.005 * delta.x));
camera.target = v3.add(camera.position, v3.rotate(v3.sub(camera.target, camera.position), right, -0.005 * delta.y));
}
raylib.BeginDrawing();
defer raylib.EndDrawing();