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.linkLibrary(rl.artifact("raylib"));
exe.root_module.addImport("znoise", znoise.module("root")); 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.root_module.addIncludePath(b.path("src/c"));
exe.linkLibrary(znoise.artifact("FastNoiseLite")); 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.linkLibrary(rl.artifact("raylib"));
exe_unit_tests.root_module.addImport("znoise", znoise.module("root")); exe_unit_tests.root_module.addImport("znoise", znoise.module("root"));
exe_unit_tests.linkLibrary(znoise.artifact("FastNoiseLite")); 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); 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); raylib.SetWindowState(raylib.FLAG_FULLSCREEN_MODE);
var camera = raylib.Camera3D{ 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 }, .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, .fovy = 45,
.projection = raylib.CAMERA_PERSPECTIVE, .projection = raylib.CAMERA_PERSPECTIVE,
}; };
@ -117,7 +117,7 @@ pub fn main() !void {
raylib.ClearBackground(raylib.BLACK); raylib.ClearBackground(raylib.BLACK);
const right = v3.neg(v3.nor(v3.cross(camera.up, v3.sub(camera.target, camera.position)))); 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(); const speed = @as(f32, if (raylib.IsKeyDown(raylib.KEY_LEFT_CONTROL)) 25 else 5) * raylib.GetFrameTime();
var movement = v3.new(0, 0, 0); var movement = v3.new(0, 0, 0);
@ -133,8 +133,11 @@ pub fn main() !void {
moveCamera(&camera, v3.scl(v3.nor(movement), speed)); moveCamera(&camera, v3.scl(v3.nor(movement), speed));
const delta = raylib.GetMouseDelta(); 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)); // on the first mouse movement, for some reason mouse delta is completely insane, so we just ignore too large deltas
camera.target = v3.add(camera.position, v3.rotate(v3.sub(camera.target, camera.position), right, -0.005 * delta.y)); 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(); raylib.BeginDrawing();
defer raylib.EndDrawing(); defer raylib.EndDrawing();