From 5792addc4bbc91ac3d3ec76d059214ccba850cd4 Mon Sep 17 00:00:00 2001 From: uan Date: Wed, 24 Dec 2025 10:51:15 +0100 Subject: [PATCH] gravitation, no collisions --- main | Bin 17864 -> 18992 bytes main.c | 98 +++++++++++++++++++++++++++++++++++++++--------------- objects.h | 8 +++-- 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/main b/main index 2a53b05c934b6899db3120a1c747e81ec6db5e1c..3f4f04e89bec8ae81e4c88f525f49e454c8bb6e4 100755 GIT binary patch literal 18992 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 V%^kd(XV#xEls>)JTT>b<{u@|6j3WR5 literal 17864 zcmeHPe{fvIec#g$EEC&z0;@5`;Dg}C1ay{d*_9IvryplOr8X9}RYL+fopdMZ%IQwr zoj_v16&57E3T4!k5KqGxhoL~H9_pq^Ygz`MY-7ta4hRp^sO?NqNMY`Z3i6K-K?|>+ z@4o%Md-u3YJ8l0-bL+YH-S6l7V|Ty1Z}+{`TmOM?+m(x) zG9X^jAQt1gQd}!8179IAL+&*Qq(+)9%coTeF9#*NWt1sER~WEh$~7cPcEwV|<%Wc* za2Y(=RZ>>*c3P|Kn6lg~&rQZiZh19ngK8gBs~yE=b*-VldUHNqw!q-sin1NKBfAD= z*P!f}3RNCcjwi*0ehn&~c3KA+C8l<}US(&eEryw3N@Y;m^-ePQKPj(G*>$+38)2tG z0~SoVygOh=ary5i?&h7Uykh-eAD`6Ul-5MTog3@dM1r-EaCBg>cCcY%?Z$dfBIa2q z>el(`G-ri2#ktR%qQIriEJo_WrQY9z-TPIh)n7r+>>cp`xoqRd-hc7+3^7TI@ z9jZ6kkPapC$6Zc5<$nu5(lO%k2yzBS^o`JKeMF0;Z$Y4L?K~Co=gvb6<}Hvy`Y#s2 z7r{{>{nJJCw-muC4sQJH=^%hY{udM}_h#t3?M}e=;#bJe9YyeSMeqlU;NK~Ne^>h6D_Q0;**gzx* zmx+*QP5f?Xs4X5!Btk(_Bp=~uk7z>CQDxN}2?gR!fv$Ud;<15fP)JL|mDn0eZi%Cq z-Qhksi-wa5-xW&k4#ayPZQEryW6wm}B7rDcLhbFk*WcB9ufIDGj)?AfC?xsa1=<_V8GuUjs_y(2SWnlcwh)unhrK>s3V|@@*Bn0ZLLks{&k-9^=3Ag zTj$w;@H^DMvI04hl}o$=SGw1U_o452KKs!hJ&D`CLhMl3(r|b&%@SWz{J`??LYgIl z;3@IC!}GoON&~M`>k8vS;ZpqUO?@FgZH#0wVOX~B zAcZ!jsK>N-)rOV&*RtrTWji#Z)mBvwUK|BYuoKxn_hcH8{51e z!$7Y|K=o3$$GP%R1Qi2tZ1bP3B~tkekxlc-8Vt>iP@Tie> zx$#piHK$Fyf15TjU#>Y$X>WX*TnY!D;60EWROvHDKe0WH-{H+0U@Hc0YS%_K|06Vo zmU<_-NE_Y!E||$}=MjvCI<#=C&7q}gYAHLCF4M*q zy^2}^uDP5-HR_w!QWe$X_vCCxW?iR!mq_Wo9izTW+5y9Esj{m)cN5uFl%Y{5#5a#d z$@a{T%DMxq0;E-?e(GF3g$P9_GAlpP^%37C2f6E-Ld_1+6twAh{OR#=ORYy{-Kym5 z{g`SB72a+sJTnNlh}4;j&aX{gaJniRaQ|O$-Zja!azT*3;Jka{0;mC2dnt;t&MvEI z4Jy>_Tr+Wh4LMo>u8@sZ!N$u-_ZE|5=PcLEQrw6|&0k=ma_%{P(RtSdYqG+fi_m}f z%w`V%2MsOP_E{)#12DoV zTb0*GAJe_K>9})W5+m5wPv!`zE7VCxZpmVdVmf$tmcw>i%i}KpBP8D=`+%n1=ckja5Hyp%3UbUL;2i&1+)1!+&0yA3q0j{`1 zrm_B{UPI+~e5~uEl|KUt<{4tf1~C=<<-12wC9(h2M}DU3LQhRD7UFlXV~*)AbzI%T zzQ?JC$KeUR;2UT335)}hY<~imYo4cqeu`Yp50ImKCY^Z#0i(dJMz@WAH;LkYD2@(M zai<=6TNXEklFoB+R7$TZr|0H24$-wqo>~u9%~&@-k=AoH@xE%!sba2`uZ>__K^+dUREuR_L3jebZ=_$Zo$KF2Hac)b8-4hwmI613 zIduTH{lk-5s^0}3lkUJ-@Na@&0se-}FQw_py3w(Rs5|!^-3OA_o%>XLCsI-c^_Xl* z9oJ-ipsR1YZbn-;)tWkKNYdKGjJpL3pv1Vn&vNDk&KyQxJc}r7Kb(5KyVV(e)9CZ> zp+3@eCWAp{R5>djyQX zGUQre{9(f#isFwjA;2pid+&~;2fyIWX^3G<9$DHEpKC;hc8a}19HJlixd|can;ch{ ze%UEkEeq)FUC=vNJ$`P~ z$xS|%xV9`=_EqQS9;g}?w=LiFrS&&l4^-OU4Y~|4bKF2YqE2&b|h$L~DK zdx`+x64y7&nipSI_Q$A^AwLYb4{g20Do;qUv_A_x1v&j~F=v0DX+I12=a9cZ<+A_s zryZm~<ti|3-kno8s@J=+T=}y~;38-)d1>WDxViE!vl) zRD-Nj&GCrd+T<^5f!`8e^T>iC+ zXFY5+%l4r-31RP2@`sc^?6I<3TH-ZK^8HGVJz~joJCytXGh%*^ZSz>CUJ|{Ewkg`7 zXuqPvijFIKNYNvTrWKu1bVkuRMMbqyuuD<5qIHVes`X#8Ro=oXUJRs15k&c}T3Dro zmLgD!z;9#(>eE}Bo4@Q{-QGD6O%Ax%uJ^3>)YWbrknFm>>*_sq^*1W`R|klel?riQ zw`A){k3(xfPza;p-L7>pEDOT5)xV<-*%y@M_r; zbSlGv6BxWM8&V-2LWasUpA(c|ztpcW*Ll`|9+^V*FV-$PZ{fhMW4+v!WG@CSpJ7_Nc{7{zOMZp8txW&TJf@`L5~5y0`2Wk@sxY35WSC|EyU8` zBV64wmw%~}e)2KmYKq|35nfhpK1Z?T7mMhB8F)47@Aev+?h1o$E~2j$!FK_78>V^J z81QOpu@WlxVlVJQarkx-{Au8Y{J#X;RUrPSq#u`fM}4f#>+??}o>xW5yruNNuO8gw z-Z3Qq3cSFO5|w3z>wg9C>awfM`+`flR_eRNb;`foyN2+KO5gr`QD4M=V-fsz<-b`S z8jyS2@V^JR%W|J`eY%wXL8UMEx*?1f@&8~E{JYA(rse_m|0hNCpDlvFDE)jkZa*%f ze@@~q(W?6QDOK=46w!ZI=`TWU}VdSW=+66g&3lYt%q zAdwvC?)G$v+yNkevd`Z|M}QL0495IDkyvLS;twWc@q|AxFetiWef^P8G8FXG71p40 zGhu%qj=wDVL(yb>2#0NOY{wrQ=<6GTiG}k+GnuDK$8S&{zkkcl#_c}8@AeitqvXfw zIKNL*pw_Ze__uD`(bTxjzhldmUB2D^-HlD#d{At;>-NU&tV^wEZ!B$JJV%9du7(BUSNF4qhRXvm*u=xh#HNi*iL4dwm5GU z4N;ZzkA)ehw`f!e;YkejB?FzH$+$s#ITw!Ns9V4AL}SU2rzbk#>5s?yL-FL01?n6K z<1lDAsG!EC)>^u0qJpx0Xb>#jMbM7PKzKsE>b~g>!W(mj590u%F2>&}u`xjVB@C;-m`?>BF3THyP*7OB1^y<#`#m+CY4et{$ztLuIKgWCnD=NzC zG{f|~XDy$fH<`LwQBk}79^m+Mbd2lI`!Y-nU`8S_!C*6g#%( z{S#W>=nG3`kQ{K0t`cus8@%sTVsu#Dj5@lPP2vCHN2dmR5i5*!%rMz-TP{yA)^{ieOz_ib1M5NXmN=9TT4UIt^U zz3?j4I)i#`0e34g6Z&R_d~x~w-tDb7G`Jkrr?RZ6T9vPgGevBFlZhA^wzpCqJ66?x xRsMdp!F~;d^j^pH;rVwVFs{4Retwg|owqsXa#@#d*FyGL^ #include +#include #include #include "objects.h" + struct global { const int scwidth, scheight; int fps; object *objs[128]; size_t obj_count; - double terminal_yv; + double terminal_v; }; -struct global gl = {1600, 900, 60, {}, 0, -20}; +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) { @@ -27,23 +35,72 @@ 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++) { object *obj = gl.objs[i]; - obj->vel.y -= 9.81 * GetFrameTime(); - if (obj->vel.y < gl.terminal_yv) - { - obj->vel.y = gl.terminal_yv; - } + obj->vel.y -= 0 * GetFrameTime(); + //if (obj->vel.y < gl.terminal_yv) if (obj->pos.y < obj->r) { obj->pos.y = obj->r; obj->vel.y *= -obj->restitution; } - obj->pos.x += obj->vel.x * GetFrameTime(); - obj->pos.y += obj->vel.y * GetFrameTime(); - obj->pos.z += obj->vel.z * GetFrameTime(); + for (int j = 0; j < gl.obj_count; j++) + { + if (i==j) continue; + object *obj2 = gl.objs[j]; + integrate_g(obj, obj2, gravitation_force(obj, obj2)); + //float min_dist_delta = Vector3Distance(obj->pos, obj2->pos) - (obj->r+obj2->r); + //if (min_dist_delta < 0) + //{ + // Vector3SubtractValue(obj->pos, min_dist_delta); + //} + } + float ratio_speed_to_terminal = Vector3Length(obj->vel)/gl.terminal_v; + if (Vector3Length(obj->vel) > gl.terminal_v) + { + obj->vel = Vector3Scale(obj->vel, 1.0f/ratio_speed_to_terminal); + } + DrawLine3D(obj->pos, Vector3Add(obj->pos, obj->vel), GREEN); + obj->pos = Vector3Add(obj->pos, Vector3Scale(obj->vel, GetFrameTime())); } } @@ -56,23 +113,17 @@ void freeobjs() } } -void applyforce() -{ - for (int i = 0; i < gl.obj_count; i++) - { - object *obj = gl.objs[i]; - obj->vel.x += 1; - } -} - int main(void) { InitWindow(gl.scwidth, gl.scheight, "raylib engine"); SetTargetFPS(gl.fps); - addobj(newobj((Vector3){0, 30, 0}, 2, RED, 0.5)); - addobj(newobj((Vector3){5, 2, 0}, 1, BLUE, 1)); + 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}; Camera3D camera = {{0, 20, -30}, {0, 0, 0}, {0, 1, 0}, 45, CAMERA_PERSPECTIVE}; + DisableCursor(); while(!WindowShouldClose()) { @@ -85,11 +136,6 @@ int main(void) { DrawPlane((Vector3){0, 0, 0}, (Vector2){100, 100}, GRAY); updateobjs(); drawobjs(); - - if (IsKeyPressed(KEY_L)) { - applyforce(); - } - EndMode3D(); } EndDrawing(); diff --git a/objects.h b/objects.h index cc714f2..6b0743b 100644 --- a/objects.h +++ b/objects.h @@ -5,12 +5,13 @@ typedef struct { Vector3 pos; Vector3 vel; - float r; + double r; Color color; - float restitution; + double restitution; + double mass; } object; -object *newobj(Vector3 pos, float r, Color c, float rest) +object *newobj(Vector3 pos, double r, Color c, double rest, double m) { object *obj = (object*)malloc(sizeof(object)); obj->r = r; @@ -18,5 +19,6 @@ object *newobj(Vector3 pos, float r, Color c, float rest) obj->color = c; obj->vel = (Vector3){0, 0, 0}; obj->restitution = rest; + obj->mass = m; return obj; }