move_bounce nachstellen

  • GM 7
  • move_bounce nachstellen

    Hallo

    ich stehe gerade vor einem problem: ich möchte die move_bounce funktion nachstellen.

    Ich habe einen punkt. Dieser punkt hat ein paar variablen die mir zu verfügng stehen: Die koordinaten, die hspeed und vspeed.
    Ich habe mir das mal so vorgestellt. Ich muss erst den winkel der oberfläche finden (grüner strich). Danch den einfallswinkel (rot), disen um die hellgrüne akse spiegeln, und dann diesen winkel wieder an hspeed und vspeed anpassen.


    Da stehe ich vor ein paar problemen:

    1. Wie finde ich den winkel der oberfläche?
    2. wie spiegle ich den einfallswinkel um die hellgrüne akse?
    Ich dachte mir das man den winkel von der oberfläche findet, indem man mit einer schleife alle winkel um sich herrum abtastet. Ich habe mal was gemacht, das kann man aber für nichts gebrauchen :P
    Spoiler anzeigen

    GML-Quellcode

    1. // gibt den winkel zwischen der richtung und der oberfläche des anderen objectes wieder
    2. // get_collision_angle(faktor)
    3. // faktor = 1 -> unendlich (in pixeln, wie weit weg von der kollsion sollen punkte gecheckt werden um den vinkel zu ermessen)
    4. l=argument // ein faktor
    5. ang='';
    6. dir=point_direction(x,y,xprevious,yprevious);
    7. xx=x // noch sind das die koordinaten des objectes. Der sinn ist es die koordinaten vom punkt zu nehmen
    8. yy=y
    9. for(i=0;i<360;i+=1)
    10. {
    11. if collision_point(xx+lengthdir_x(l,i),yy+lengthdir_y(l,i),all,true,false) {
    12. ang=i;
    13. i=360 // damit es endet
    14. }
    15. }
    16. return ang;
    Alles anzeigen


    MfG SDX

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von SDX ()

  • 1) Wenn du die Normale hast, ist das ziemlich einfach:

    GML-Quellcode

    1. a_winkel=(normale-(e_winkel+180))+normale; //Wobei die Normale von der Oberfläche wegzeigen muss


    Das hab ich mir irgendwann mal zusammengreimt, indem ich mir eine Skizze angeschaut habe.

    2) Wie wird die Oberfläche überhaupt festglegt? Durch Punkte?

    PS: Es heißt Achse :P

    © 2008 by Teamgrill Productions
  • Soul Reaver schrieb:

    1) Wenn du die Normale hast, ist das ziemlich einfach:

    GML-Quellcode

    1. a_winkel=(normale-(e_winkel+180))+normale; //Wobei die Normale von der Oberfläche wegzeigen muss


    Das hab ich mir irgendwann mal zusammengreimt, indem ich mir eine Skizze angeschaut habe.

    2) Wie wird die Oberfläche überhaupt festglegt? Durch Punkte?

    PS: Es heißt Achse :P
    Wenn du das jetzt ausrechnen würdest, du hast normale, ziehst davon e_winkel+180 ab und addierst normale... wäre es dann nicht a_winkel=normale*2-180-e_winkel? nur mal so zusammengefasst.


    SDX schrieb:

    Hallo

    ich stehe gerade vor einem problem: ich möchte die move_bounce funktion nachstellen.

    Ich habe einen punkt. Dieser punkt hat ein paar variablen die mir zu verfügng stehen: Die koordinaten, die hspeed und vspeed.
    Ich habe mir das mal so vorgestellt. Ich muss erst den winkel der oberfläche finden (grüner strich). Danch den einfallswinkel (rot), disen um die hellgrüne akse spiegeln, und dann diesen winkel wieder an hspeed und vspeed anpassen.


    Da stehe ich vor ein paar problemen:

    1. Wie finde ich den winkel der oberfläche?
    2. wie spiegle ich den einfallswinkel um die hellgrüne akse?
    Ich dachte mir das man den winkel von der oberfläche findet, indem man mit einer schleife alle winkel um sich herrum abtastet. Ich habe mal was gemacht, das kann man aber für nichts gebrauchen :P

    MfG SDX
    So wie ich das sehe, hast du den Einfallwinkel gegeben, dadurch, dass du hspeed und vspeed hast. Was wichtig zu wissen ist, ist die Oberfläche.
    Die lässe sich nicht einfach ermitteln, es sei denn du hast die genaue Form des Objektes und berechnest es per Hand.
    Bei einer Kugel allerdings wäre dieser über eine Rechtwinklig aufliegende öhhh Tangente? (Bin nicht sicher obs so heisst) annährend machbar.

    Die wäre beim Aufprall halt "point_direction(bewegendesobjekt->kugel)+/-90"
    Wobei die grüne Linie ja dann nur point_direction wäre.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Schattenphoenix ()

  • Schattenphoenix schrieb:

    Soul Reaver schrieb:

    1) Wenn du die Normale hast, ist das ziemlich einfach:

    GML-Quellcode

    1. a_winkel=(normale-(e_winkel+180))+normale; //Wobei die Normale von der Oberfläche wegzeigen muss


    Das hab ich mir irgendwann mal zusammengreimt, indem ich mir eine Skizze angeschaut habe.

    2) Wie wird die Oberfläche überhaupt festglegt? Durch Punkte?

    PS: Es heißt Achse :P
    Wenn du das jetzt ausrechnen würdest, du hast normale, ziehst davon e_winkel+180 ab und addierst normale... wäre es dann nicht a_winkel=normale*2-180-e_winkel? nur mal so zusammengefasst.


    Ja ist mir auch schon aufgefallen, war nur immer zu faul, das auszubessern.

    Edit: @ Maxda: Es stimmt schon so... sonst würde sich das Objekt erst wieder in Richtung Oberfläche bewegen.

    © 2008 by Teamgrill Productions
  • Die oberfläche ist ein bisschen schwierig, denn dass ist einfach nur ein Sprite.
    Deshalb mache ich das ja mit der abchecken, wenn ihr das versteht?

    Das mit dem spiegeln wäre dann ja so zu machen:

    Quellcode

    1. a_winkel=(oberfläche+90-(e_winkel))+oberfläche+90;


    EDIT: Die collision wirft immer noch fragen auf :P
    ich weiß wirklich nicht wie ich den winkel finden soll :S
    MfG SDX

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SDX ()

  • Die wirkliche Frage ist wohl, wie kriegt man den Winkel der Oberfläche.
    Vielleicht kannst du mit collision_point, collision_line und ähnlichem die Winkel ausprobieren und dementsprechend rausfinden.
    Mehrere collision_lines setzen, mit Punkten ein wenig feinarbeit machen und schon hast du den Winkel.
    Wenn du dich ransetzt, kann man damit bestimmt was machen, aber wie genau hab ich nicht im Kopf.
    Vielleicht am Punkt der Kollision eine Linie in eine bestimmte Anzahl an Richtungen überprüfen und schauen, wie keine Kollisionen auftreten und wann sie es tun.
    Damit könnte man z.B. auch rausfinden, ob das Objekt wo es drauf trifft eine Spitze ist oder so. Vielleicht kannst du damit was anfangen.

    Ich denke das wird rechenintensiv, aber probiers vielleicht aus, du bist ja nich ganz doof =P
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Danke Schattenphoenix, so ähnlich hatte ich es auch geplant, nur mit collision_point, wechles sich als einer der fehler entpupte. Jetzt habe ich collision_line genommen, und musste danach (welches ein bisschen lange dauerte bis ich drauf kam) das letzt argument im collision_line argument auf true setzen, sonst würde er sich selber ja mitnehmen, und dann alle winkel als bestzt makiert. Wer sich für den code interressiert:
    Spoiler anzeigen

    GML-Quellcode

    1. // gibt den vinkel zwischen der richtung und der oberfläche des anderen objectes wieder
    2. // get_collision_angle(faktor)
    3. // faktor = 1 -> unendlich (in pixeln, wie weit weg von der kollsion sollen punkte gecheckt werden um den vinkel zu ermessen)
    4. l=argument // ein faktor
    5. ang='';
    6. dir=point_direction(x,y,xprevious,yprevious);
    7. xx=x // noch sind das die koordinaten des objectes. Der sinn ist es die koordinaten vom punkt zu nehmen
    8. yy=y
    9. li=file_text_open_write('test.txt')
    10. for(i=0;i<360;i+=1)
    11. {
    12. if collision_line(xx+lengthdir_x(l,i),yy+lengthdir_y(l,i),xx,yy,all,true,true)
    13. {
    14. file_text_write_string(li,string(i)+' = true'+'
    15. ');
    16. }
    17. else
    18. {
    19. file_text_write_string(li,string(i)+' = false'+'
    20. ');
    21. }
    22. }
    23. file_text_close(li)
    24. execute_program('C:\WINDOWS\NOTEPAD.EXE','test.txt',false)
    Alles anzeigen
    Wenn der ausgeführt wird, öffnet sich ein textdokument, das so ausieht:
    Spoiler anzeigen

    Quellcode

    1. 0 = true
    2. 1 = true
    3. 2 = true
    4. 3 = true
    5. 4 = true
    6. 5 = true
    7. 6 = true
    8. 7 = true
    9. 8 = true
    10. 9 = true
    11. 10 = true
    12. 11 = true
    13. 12 = true
    14. 13 = true
    15. 14 = true
    16. 15 = true
    17. 16 = true
    18. 17 = true
    19. 18 = true
    20. 19 = true
    21. 20 = true
    22. 21 = true
    23. 22 = true
    24. 23 = true
    25. 24 = true
    26. 25 = true
    27. 26 = true
    28. 27 = true
    29. 28 = true
    30. 29 = true
    31. 30 = true
    32. 31 = true
    33. 32 = true
    34. 33 = true
    35. 34 = true
    36. 35 = true
    37. 36 = true
    38. 37 = false
    39. 38 = false
    40. 39 = false
    41. 40 = false
    42. 41 = false
    43. 42 = false
    44. 43 = false
    45. 44 = false
    46. 45 = false
    47. 46 = false
    48. 47 = false
    49. 48 = false
    50. 49 = false
    51. 50 = false
    52. 51 = false
    53. 52 = false
    54. 53 = false
    55. 54 = false
    56. 55 = false
    57. 56 = false
    58. 57 = false
    59. 58 = false
    60. 59 = false
    61. 60 = false
    62. 61 = false
    63. 62 = false
    64. 63 = false
    65. 64 = false
    66. 65 = false
    67. 66 = false
    68. 67 = false
    69. 68 = false
    70. 69 = false
    71. 70 = false
    72. 71 = false
    73. 72 = false
    74. 73 = false
    75. 74 = false
    76. 75 = false
    77. 76 = false
    78. 77 = false
    79. 78 = false
    80. 79 = false
    81. 80 = false
    82. 81 = false
    83. 82 = false
    84. 83 = false
    85. 84 = false
    86. 85 = false
    87. 86 = false
    88. 87 = false
    89. 88 = false
    90. 89 = false
    91. 90 = false
    92. 91 = false
    93. 92 = false
    94. 93 = false
    95. 94 = false
    96. 95 = false
    97. 96 = false
    98. 97 = false
    99. 98 = false
    100. 99 = false
    101. 100 = false
    102. 101 = false
    103. 102 = false
    104. 103 = false
    105. 104 = false
    106. 105 = false
    107. 106 = false
    108. 107 = false
    109. 108 = false
    110. 109 = false
    111. 110 = false
    112. 111 = false
    113. 112 = false
    114. 113 = false
    115. 114 = false
    116. 115 = false
    117. 116 = false
    118. 117 = false
    119. 118 = false
    120. 119 = false
    121. 120 = false
    122. 121 = false
    123. 122 = false
    124. 123 = false
    125. 124 = false
    126. 125 = false
    127. 126 = false
    128. 127 = false
    129. 128 = false
    130. 129 = false
    131. 130 = false
    132. 131 = false
    133. 132 = false
    134. 133 = false
    135. 134 = false
    136. 135 = false
    137. 136 = false
    138. 137 = false
    139. 138 = false
    140. 139 = false
    141. 140 = false
    142. 141 = false
    143. 142 = false
    144. 143 = false
    145. 144 = false
    146. 145 = false
    147. 146 = false
    148. 147 = false
    149. 148 = false
    150. 149 = false
    151. 150 = false
    152. 151 = false
    153. 152 = false
    154. 153 = false
    155. 154 = false
    156. 155 = false
    157. 156 = false
    158. 157 = false
    159. 158 = false
    160. 159 = false
    161. 160 = false
    162. 161 = false
    163. 162 = false
    164. 163 = false
    165. 164 = false
    166. 165 = false
    167. 166 = false
    168. 167 = false
    169. 168 = false
    170. 169 = false
    171. 170 = false
    172. 171 = false
    173. 172 = false
    174. 173 = false
    175. 174 = false
    176. 175 = false
    177. 176 = false
    178. 177 = false
    179. 178 = false
    180. 179 = false
    181. 180 = false
    182. 181 = false
    183. 182 = false
    184. 183 = false
    185. 184 = false
    186. 185 = false
    187. 186 = false
    188. 187 = false
    189. 188 = false
    190. 189 = false
    191. 190 = false
    192. 191 = false
    193. 192 = false
    194. 193 = false
    195. 194 = false
    196. 195 = false
    197. 196 = false
    198. 197 = false
    199. 198 = false
    200. 199 = false
    201. 200 = false
    202. 201 = false
    203. 202 = false
    204. 203 = false
    205. 204 = false
    206. 205 = false
    207. 206 = false
    208. 207 = false
    209. 208 = false
    210. 209 = false
    211. 210 = false
    212. 211 = false
    213. 212 = false
    214. 213 = false
    215. 214 = false
    216. 215 = false
    217. 216 = false
    218. 217 = false
    219. 218 = false
    220. 219 = false
    221. 220 = false
    222. 221 = false
    223. 222 = false
    224. 223 = false
    225. 224 = false
    226. 225 = false
    227. 226 = false
    228. 227 = false
    229. 228 = false
    230. 229 = false
    231. 230 = false
    232. 231 = false
    233. 232 = false
    234. 233 = false
    235. 234 = false
    236. 235 = false
    237. 236 = false
    238. 237 = false
    239. 238 = false
    240. 239 = false
    241. 240 = false
    242. 241 = false
    243. 242 = false
    244. 243 = false
    245. 244 = false
    246. 245 = false
    247. 246 = false
    248. 247 = false
    249. 248 = false
    250. 249 = false
    251. 250 = false
    252. 251 = false
    253. 252 = false
    254. 253 = false
    255. 254 = false
    256. 255 = false
    257. 256 = false
    258. 257 = false
    259. 258 = false
    260. 259 = false
    261. 260 = false
    262. 261 = false
    263. 262 = false
    264. 263 = false
    265. 264 = false
    266. 265 = false
    267. 266 = false
    268. 267 = false
    269. 268 = false
    270. 269 = false
    271. 270 = false
    272. 271 = true
    273. 272 = true
    274. 273 = true
    275. 274 = true
    276. 275 = true
    277. 276 = true
    278. 277 = true
    279. 278 = true
    280. 279 = true
    281. 280 = true
    282. 281 = true
    283. 282 = true
    284. 283 = true
    285. 284 = true
    286. 285 = true
    287. 286 = true
    288. 287 = true
    289. 288 = true
    290. 289 = true
    291. 290 = true
    292. 291 = true
    293. 292 = true
    294. 293 = true
    295. 294 = true
    296. 295 = true
    297. 296 = true
    298. 297 = true
    299. 298 = true
    300. 299 = true
    301. 300 = true
    302. 301 = true
    303. 302 = true
    304. 303 = true
    305. 304 = true
    306. 305 = true
    307. 306 = true
    308. 307 = true
    309. 308 = true
    310. 309 = true
    311. 310 = true
    312. 311 = true
    313. 312 = true
    314. 313 = true
    315. 314 = true
    316. 315 = true
    317. 316 = true
    318. 317 = true
    319. 318 = true
    320. 319 = true
    321. 320 = true
    322. 321 = true
    323. 322 = true
    324. 323 = true
    325. 324 = true
    326. 325 = true
    327. 326 = true
    328. 327 = true
    329. 328 = true
    330. 329 = true
    331. 330 = true
    332. 331 = true
    333. 332 = true
    334. 333 = true
    335. 334 = true
    336. 335 = true
    337. 336 = true
    338. 337 = true
    339. 338 = true
    340. 339 = true
    341. 340 = true
    342. 341 = true
    343. 342 = true
    344. 343 = true
    345. 344 = true
    346. 345 = true
    347. 346 = true
    348. 347 = true
    349. 348 = true
    350. 349 = true
    351. 350 = true
    352. 351 = true
    353. 352 = true
    354. 353 = true
    355. 354 = true
    356. 355 = true
    357. 356 = true
    358. 357 = true
    359. 358 = true
    360. 359 = true
    Alles anzeigen

    Jetzt muss ich die daten nur noch in eine liste speichern, und dann irgendwie verarbeiten.

    EDIT: welches sich als schwierich herrausstellt, denn es reicht ja nicht nur einfach die freien und unfreien winkel zu kennen, ich muss ja auch noch den winkel der linie (grüne linie) errechen ?(


    MfG SDX :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SDX ()

  • sag mal, welche objekte sollen denn bouncen?

    stell dir nen kreis vor!

    dieser kreis berührt wenn er auf horizontalem boden fällt den "boden" in seinem untersten punkt, wehh er zB gegen ne vertiktale wand fliegt in seinem seitlichsten punkt.

    die normale der oberfläche ist jeweils die verbindung dieses berührpunktes mit dem mittelpunkt, FALLS es ein kreis ist, wenn nicht dann kannsd du es vll an einen kreis annähern oder an eine ellipse, was jedcoh die winkel nicht mehr so genau bestimmten ließe.

    bei einer kugel ginge es deswegen so leicht da die normale die verbindung des berührpunktes mit dem mittelpunkt ist (wie ja shcon gesagt) und somit auch durch den schwerpunkt der kugel geht (angenommen die kugel sei gleichmäßig gebaut),

    wäre das nicht der fall so ist der berührpunkt ein drehpunkt an dem sich das objekt erst dreht (der schwerpunkt dreht sich um den berührpunkt), solange bis die normale wieder durch den schwerpunkt ginge.

    also "spaß" beiseite.

    wenn es eine kugel ist kannsd du mit einer schleife jeden kreispuonkt abfragen und schaun welcher der wand denn am nähesten ist bzw. die wand berührt und somit einfach die normale GENAU (so genau wies der PC denn kann, oder die zeichnungen gezeichnet sind) berechnen.
  • Ich möchte dich bitten, speicher nicht sone große Liste, das ist unnütz.
    Machs mit if() und >/< du hast doch jeweils Bereiche, da lässt sich das viel leichter erledigen.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • @anti0ogen blau:
    ich will nur einen punkt boucen lassen, dieser hat kein eigenes sprite, und ist auch kein object.

    @Schattenphoenix
    Das ist ja nicht der sinn der sache, das weiß ich auch. Ich wollte doch erst mal nach tagen in der dunkelheit was handfestes haben :P

    Nur ich weiß wirklich nicht ich dieser verdamte grüne linie erstellen soll. Ich kann ja ohne große probleme die zwei (bzw mehr, das ist ert mal nicht interresant) winkel finden, wo der übergang zwischen freien und unfreien raum besteht. Sagen wir mal die differens ist so 230°. Dann muss ich ja nur noch 180° für die linie abziehen, also 50°, wenn ich dass dann durch zwei teile, habe ich 25°, welches ich dann nur noch auf den ersten übergang von unfreim zu freiem gebiet addieren, dann müsste ich doch den vinkel der linie haben!?! Dann orthogonal zur grünen linie wäre dann die achse um die der winkel gespiegelt werden soll!?!

    Wärend ich jetzt hier geschrieben habe ich mir (glaub ich) ein kleines lich aufgegangen. Wenn ihr glaubt einen fehler in meiner thoerie gefunden zu haben, schreibt das doch bitte :D


    MfG SDX
  • Wenn du den Bereich hast, wo die linie Nix trifft... und du weisst, bei welchem Winkel es zuerst auftritt...

    Sagen wir du machst diesen Test mit den Linien, das erste mal kriegst du keine Kollision bei 110° dann kriegst du wieder ne Kollision bei 240° dann liegt die grüne Linie dazwischen.

    (110+240)/2 =175°

    Ist ne Annäherung, bin nicht sicher ob man es 100%ig genau so machen kann. Da du auf pixelbasis arbeitest, ist das eh nie 100%ig genau.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet