From e4c77ed5e209ef7e06ae33176b7db8f6d3e06f07 Mon Sep 17 00:00:00 2001 From: uan Date: Wed, 24 Dec 2025 14:24:07 +0100 Subject: [PATCH] le palle si scontrano --- main | Bin 18992 -> 19368 bytes main.c | 57 +++++------------------------- objects.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ objects.h | 17 ++++----- 4 files changed, 115 insertions(+), 60 deletions(-) create mode 100644 objects.c diff --git a/main b/main index 3f4f04e89bec8ae81e4c88f525f49e454c8bb6e4..9ad7af82c323301431439d53c753e7eb255375b3 100755 GIT binary patch literal 19368 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 delta 4443 zcmaJ_3sh9c8J>HW1$G5?mxsF|!txMA&F-Q`P@`NPD;FbbBQ_FEBSEm_fruDAsSy>8 zZWf!>UlZCUr{v^i8k1&{ksL9Ew(pIBDASJA+Exm<6kjWSeTMjSayEw7}a4=C5;lZDhp5{ zq!id9RLRb%W))E#j!*Co)gGKFF-D_)LDl1oGgBvKsZJ(lsZKQ7sH#aL{7Re;%LJRjMrVi31_oV9{PUFy?>lw+{Oc=R zE$O`jUv`zPa{r_KF5PYcB>m{0y&5eMCE?0+LcXnWm{PW|frF;xq3)ZauYqbG{L{{em%y}oJCWO0YED+>;q%?LD}FHJ=5IZO^5$aSV)Bh zRhaB~A}D+HlV;&;cPtQOPePW;in7-ols#b|_$7(>IJmjb3`@dCihc=Jhvy_c9a5BL zcS!KMLvmFwx_NUZx|w#Y;T4|`>@gz^_oomtfb$JPeoUg!5BJ5SiDyHwAto((HI5xL z-PcLY0gTmyb1&6{W2d5<&PKKM34&dtXy8Gl-xw#Wd6?TG_ zN%pw?fiXjHHM~*$!)RC$kv!>2Euv<)1C2|)nC9(htl1)b+ zjd(4W#Wii7_5;KkC#3UC`*9lmbkbGVZd(QS_7O?(T{PWQ+~+weEU>|X5%EnwZ&%+AovE~1)dwoRq_vq&*BI;89j&8(@M2X@m8z4~oA^i8tbNKqPNrV;k2 z5u|vnbUvyrQnl{gRCtUFts3MxjcL=Emo#QC9Uxen)ExF{>itwbnfp0-%H2WFxxjma zit?2ePjh*P+jo?n>aC!w4XxWvXDcX{`$$9M7e=8nzum7Lsk ziG}IKAe;Fs>GJHL5S&O)AzX;EHT4vFI^{0Ez1VX}HuRQyj%z7y(U|QT(}J&L3npIH zf=i;*RCh)_HFja}zysf7cN~{=U^Nxz4Pf^XcFq05mQK^wkMN`lWZ+pBC`TnLgS?}< ze@TIE>HXd9v#m!W+v}|%{Vw}rsJFX>Z(x<(3a(U}V1pOzR^d%5?@D!n4^?qg1?!M| zk*bBQ(3R>G&M^KG8)#3n3E>R2H`NBMD213cg*iLS_-7bWO0P8)JyKoSP*_>@@QQ|& zYwDK6N9hY8HzNa{%*Y6x3sY6fk}?ZQ*N-69CzZ2hPbg4 z+&UuQAHhc?g~;&R0Xewy8T|d%k-1#ACb1ST5+b>mg0Y>;ml&m&1QFgCYZXSqiLp*W z*Z$quQ-WZHceAX}mlXxRahXm1^tbWWw(+L05p8V+OnxXJsrpEy8##{}>1pIUI|=cr zIO(^VjZ%F2y9k+5D2&$4s7D1|pHn_jl!HiLx}Yd6708@HrVZ&+pDM~HNbkI;C?TXv zktShI%}DP;x*zFMq$z$ySx@zNL_CLd_UDSyiPZU}qFhG$3#4HpY{*W#!;G#o(G@9< zFw^q6@R^7@J=I~$z^53Wb>|hO9^TJR7hkymzaF31)Pl+!oDaMB6vUXH6pNz6AB>8K zM12xI`|!#8KlamT&qwrpk>7j@N5&_HPek_O zMfiAp^6~}9Zoss^!XL^TZcAEp&0)F=A`YfgYeY;D9-?#q!*vOBZAaa1w68?_i#imv zsi{7m)gh`qX~G{x+&|}p?EQKPG5Eqc#gVM#a7L30!Qx1<%(Y0&I!XnR02DY<@P1P1 zaHh7VsW!SMX_M>{qej*fQUwPb`GOg)I#ObN8LBOU+m>ZOn$wZ);%bFgO$*-7v z!;_lBjJJunMpkTy6drZ^GUvrlxgy3GAGn1TWj;gcZ;=eN0>oY0H$D zi37+M7GpQd3?D=G@{BZm0rgfnkB?e{ zUr4mEt&H?u)SC(JFTQ4&5xXjmujEm(xM2m?Z@*3dFpV;5Ewzeagy=eO4uJ|RG$s7bZ@##cfI{JF$w zyybrYqCC}j%eQ}_JQaen8MezVL;p;PP8JWKE;-kt9TnPt8~k7>Z4!G3JXPv2YUf3# z3yzgeHQZR1Ak4|fZ|?%^9k6Lmt|78o^|=wc=Hw^z #include "objects.h" - struct global { const int scwidth, scheight; int fps; @@ -15,12 +14,6 @@ struct global { struct global gl = {1600, 900, 144, {}, 0, 15}; -float min(float a, float b) -{return a>b?b:a;} - -float max(float a, float b) -{return a>b?a:b;} - void addobj(object *obj) { gl.objs[gl.obj_count++] = obj; @@ -35,43 +28,6 @@ void drawobjs() } } -Vector3 gravitation_force(object *obj1, object *obj2) -{ - const double GRAVITY_FACTOR = 1; - Vector3 force; - double dist, mass, total_g; - mass = obj1->mass * obj2->mass; - force = Vector3Subtract(obj2->pos, obj1->pos); - - dist = Vector3Length(force); - force = Vector3Normalize(force); - - dist = max(dist, obj1->r+obj2->r); - - total_g = GRAVITY_FACTOR * mass / (dist * dist); - force = Vector3Scale(force, total_g); - - return force; -} - -void integrate_g(object *obj1, object *obj2, Vector3 force) -{ - Vector3 acc; - double f, a; - - f = Vector3Length(force); - //acc = Vector3Scale(Vector3Subtract(obj1->pos, obj2->pos), f); - acc = force; - - a = f / obj1->mass; - acc = Vector3Scale(Vector3Normalize(acc), a*GetFrameTime()); - obj1->vel = Vector3Add(obj1->vel, acc); - - a = f / obj2->mass; - acc = Vector3Scale(Vector3Normalize(acc), a*GetFrameTime()); - obj2->vel = Vector3Add(obj2->vel, acc); -} - void updateobjs() { for (int i = 0; i < gl.obj_count; i++) @@ -93,6 +49,10 @@ void updateobjs() //{ // Vector3SubtractValue(obj->pos, min_dist_delta); //} + if (Vector3Distance(obj->pos, obj2->pos) < obj->r+obj2->r+0.01f) + { + resolve_collision(obj, obj2); + } } float ratio_speed_to_terminal = Vector3Length(obj->vel)/gl.terminal_v; if (Vector3Length(obj->vel) > gl.terminal_v) @@ -118,10 +78,9 @@ int main(void) { InitWindow(gl.scwidth, gl.scheight, "raylib engine"); SetTargetFPS(gl.fps); - addobj(newobj((Vector3){0, 20, 0}, 3, RED, 1, 50000)); - addobj(newobj((Vector3){4, 20, 0}, 1, BLUE, 1, 1000)); - addobj(newobj((Vector3){-6, 18, 0}, 2, GREEN, 1, 2000)); - gl.objs[1]->vel = (Vector3){0, 0, 2}; + addobj(newobj((Vector3){0, 20, 0}, 1, RED, 1, 1000)); + addobj(newobj((Vector3){8, 20, 0}, 2, BLUE, 1, 2000)); + gl.objs[1]->vel = (Vector3){0, 0, 0}; Camera3D camera = {{0, 20, -30}, {0, 0, 0}, {0, 1, 0}, 45, CAMERA_PERSPECTIVE}; DisableCursor(); @@ -133,7 +92,7 @@ int main(void) { { ClearBackground(BLACK); BeginMode3D(camera); - DrawPlane((Vector3){0, 0, 0}, (Vector2){100, 100}, GRAY); + DrawPlane((Vector3){0, 0, 0}, (Vector2){500, 500}, RAYWHITE); updateobjs(); drawobjs(); EndMode3D(); diff --git a/objects.c b/objects.c new file mode 100644 index 0000000..87c874f --- /dev/null +++ b/objects.c @@ -0,0 +1,101 @@ +#include "objects.h" +#include +#include + +#define min(a, b) (a>b?b:a); +#define max(a, b) (a>b?a:b); + +object *newobj(Vector3 pos, double r, Color c, double rest, double m) +{ + object *obj = (object*)malloc(sizeof(object)); + obj->r = r; + obj->pos = pos; + obj->color = c; + obj->vel = (Vector3){0, 0, 0}; + obj->restitution = rest; + obj->mass = m; + return obj; +} + +Vector3 gravitation_force(object *obj1, object *obj2) +{ + const double GRAVITY_FACTOR = 1; + Vector3 force; + double dist, mass, total_g; + mass = obj1->mass * obj2->mass; + force = Vector3Subtract(obj2->pos, obj1->pos); + + dist = Vector3Length(force); + force = Vector3Normalize(force); + + dist = max(dist, obj1->r+obj2->r); + + total_g = GRAVITY_FACTOR * mass / (dist * dist); + force = Vector3Scale(force, total_g); + + return force; +} + +void integrate_g(object *obj1, object *obj2, Vector3 force) +{ + Vector3 acc; + double f, a; + + f = Vector3Length(force); + //acc = Vector3Scale(Vector3Subtract(obj1->pos, obj2->pos), f); + acc = force; + + a = f / obj1->mass; + acc = Vector3Scale(Vector3Normalize(acc), a*GetFrameTime()); + obj1->vel = Vector3Add(obj1->vel, acc); + + a = f / obj2->mass; + acc = Vector3Scale(Vector3Normalize(acc), a*GetFrameTime()); + obj2->vel = Vector3Add(obj2->vel, acc); +} + +void resolve_collision(object *obj1, object *obj2) +{ + Vector3 normal = Vector3Subtract(obj1->pos, obj2->pos); + float distsq = Vector3LengthSqr(normal); + float sumrad = obj1->r+obj2->r; + float mindistsq = sumrad*sumrad; + + if (distsq < mindistsq) { + float dist = sqrtf(distsq); + + if (dist == 0) { + normal = Vector3RotateByAxisAngle(Vector3One(), (Vector3){0, 1, 1}, rand()*360); + dist = sumrad; + } else { + normal = Vector3Scale(normal, 1.0f / dist); + } + + float overlap = sumrad - dist; + Vector3 separation = Vector3Scale(normal, overlap / 2.0f); + + obj1->pos = Vector3Subtract(obj1->pos, separation); + obj2->pos = Vector3Add(obj2->pos, separation); + + } else { + normal = Vector3Normalize(normal); + } + + float vel1_normal = Vector3DotProduct(obj1->vel, normal); + float vel2_normal = Vector3DotProduct(obj2->vel, normal); + + if (vel1_normal - vel2_normal > 0) return; + + float totalmass = obj1->mass + obj2->mass; + float vel1_normal_final = (obj1->mass * vel1_normal + obj2->mass * vel2_normal - obj2->mass * obj2->restitution * (vel1_normal - vel2_normal)) / totalmass; + float vel2_normal_final = (obj1->mass * vel1_normal + obj2->mass * vel2_normal - obj2->mass * obj1->restitution * (vel2_normal - vel1_normal)) / totalmass; + + Vector3 vel1_tang = Vector3Subtract(obj1->vel, Vector3Scale(normal, vel1_normal)); + Vector3 vel2_tang = Vector3Subtract(obj2->vel, Vector3Scale(normal, vel2_normal)); + + obj1->vel = Vector3Add(Vector3Scale(normal, vel1_normal_final), vel1_tang); + obj2->vel = Vector3Add(Vector3Scale(normal, vel2_normal_final), vel2_tang); + +} + + diff --git a/objects.h b/objects.h index 6b0743b..229e1a2 100644 --- a/objects.h +++ b/objects.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include typedef struct { @@ -11,14 +12,8 @@ typedef struct { double mass; } object; -object *newobj(Vector3 pos, double r, Color c, double rest, double m) -{ - object *obj = (object*)malloc(sizeof(object)); - obj->r = r; - obj->pos = pos; - obj->color = c; - obj->vel = (Vector3){0, 0, 0}; - obj->restitution = rest; - obj->mass = m; - return obj; -} + +object *newobj(Vector3 pos, double r, Color c, double rest, double m); +Vector3 gravitation_force(object *obj1, object *obj2); +void integrate_g(object *obj1, object *obj2, Vector3 force); +void resolve_collision(object *obj1, object *obj2);