3D kötél szimuláció, OpenGL

3D kötél szimuláció, OpenGL
2010-08-21T12:33:30+02:00
2010-08-30T19:35:45+02:00
2022-11-18T23:50:44+01:00
koti93
Sziasztok!

3d-s játékhoz egyszerű kötél szimulációt szeretnék
megvalósítani. Annyira egyszerűt, hogy csak a két
végpontot adom meg és a hosszát és rajzolja ki.
Szóval nincs himbálózás, stb.

Sokat kerestem a téma után, de görbékkel valósították
meg legtöbben. Én egy ellipszisre gondoltam, aminek
csak az alsó felét rajzolom ki, de nem görbét, hanem
törtvonalat (pontokat szakasszal kötöm össze).

Volt egy próbálkozásom (sin, cos), de csak kört
rajzolt, így a kötél távolsága nem volt szabályozható.

A lényeg hogy a kötélnek van két végpontja (rögzített)
és egy hossza (nagyobbnak kell lenni mint
|végpont-kezdőpont| ). És a kötél hossza alapján
vagy majdnem egyenes (amikor feszes a kötél), vagy
lelóg (mintha laza lenne). A lelógó kötél egy sin
vagy cos függvény részéhez hasonlít, onnan gondoltam
egy ilyen megvalósításra.

Olyan megoldást szeretnék, hogy van a kötélnek
kezdő, végpontja, hossza és a törtvonal pontjainak
száma.

type TCoord = Record x, y, z : single; end; var kezdo, veg : TCoord; hossz : single; kotel_pontjai : array of TCoord; pont_db : integer; begin setlength(kotel_pontjai, pont_db); kotel_pontjai[0] := kezdo; kotel_pontjai[pont_db-1] := veg; for i:=1 to pont_db-2 do begin // és itt számolja a pontokat end; end;

Valami ilyesmi megoldást szeretnék.
Remélem érthetően el tudtam magyarázni,
a problémámat
A segítségeket előre is köszönöm
Mutasd a teljes hozzászólást!

  • Mutasd a teljes hozzászólást!
  • hogy vagy képes az agyadban tárolni ilyen nehéz kódolást mint a C++
    Mutasd a teljes hozzászólást!
  • Köszi a linket, cserébe itt a teljes megoldás.
    c-ben, mert óvodás korom óta nem írtam pascalban semmit. xD



    #include <stdio.h> #include <stdlib.h> #include <math.h> float kotel_pontjai[100][2];; int main() { float a,da,x,y,tavx=0,tav=0,xe,ye,dx,dy,eltolas,kotel_hossz=100.0,fesztav=80.0; int i,j,db; db=10; kotel_hossz=100.0; fesztav=80.0; a=100.0; da=a/2.0; for(j = 0;j<=50;j++)//kozelites { tav = 0; tavx = 0; for(i = 0;i<=db;i++) { x = -fesztav/2.0 + fesztav*(float)i/(float)db; y = a*cosh(x/a); kotel_pontjai[i][0] = x; kotel_pontjai[i][1] = y; if(i!=0) { dx = x-xe; dy = y-ye; tav += sqrt(dx*dx + dy*dy); tavx += dx; } xe = x; ye = y; } if(tav<kotel_hossz) a -= da; else a += da; da *= 0.5; } printf("kapott hosszak %f %f \n",tav,tavx); eltolas=kotel_pontjai[0][1]; printf("kotel pontjai:\n"); for(i=0;i<=db;i++) printf("%d : %f %f \n",i+1,kotel_pontjai[i][0],-(eltolas-kotel_pontjai[i][1])); return 0; }
    Mutasd a teljes hozzászólást!
  • hogy vagy képes az agyadban tárolni ilyen nehéz kódolást mint a C++


    Ez kb olyan nehéz, mint egy kínainak kínaiul olvasni.
    Ha egész életedben ilyeneket olvasol, akkor semmi nehézség nincs benne. Fejben tartani pedig nem kell a kódot, arra ott a háttértároló.
    Kell egy egyszerűsített model a programodról, az lehet a fejedben.
    Ami még fontos, tudni kell hatékonyan keresni akármekkora programkódban.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd