Dissolve Image?
Blitz3D Forums/Blitz3D Programming/Dissolve Image?
| ||
| Hi, I am trying to break an image into pixels and then blow them away as if the image was made of dust. Any ideas on how I can apply physics to blow the pixels realistically? Thanks. |
| ||
| Types is mainly the magic behind. A 3D array with 2 fields on the 3rd dimension would work as well (current speed) |
| ||
| You still need to move a lot of pixels, this could be slow: 800*600=480000 pixels to be moved. I think you need to do some smart speed optimations. EG: move only a part of them at one time. |
| ||
| Have a look at big10p's exploding mesh demo... http://www.blitzbasic.com/codearcs/codearcs.php?code=680 |
| ||
| Ok the best option is to get sprite candy you can do this with 1 line of code , nearly http://www.x-pressive.com/SpriteCandy check the great demo to see the effect in action http://www.x-pressive.com/Downloads/SpriteCandy_Demo.exe |
| ||
| Here a very simple image to pixel explosion-ish I did ages ago. It's doesn't use physics but it should be fairly easy to adapt it to create an explosion effect. If it's the sort of thing you're after then let me know and I'll change it to something more realistic :) "space bar" to break up and "space bar" to reconstruct.
Graphics 640,480
SeedRnd MilliSecs()
; variables
Const block_size = 3
restore_frames = 100
restore_count = restore_frames
image = LoadImage("image.bmp")
width = ImageWidth(image)
height = ImageHeight(image)
block_state = 2
; Wooohooo one type
Type pixel
Field i
Field x#
Field y#
Field sx#
Field sy#
Field rsx#
Field rsy#
Field mx#
Field my#
End Type
; split the image up into ickle tiny blocks
SetBuffer ImageBuffer(image)
For count1 = 1 To height Step block_size
For count2 = 1 To width Step block_size
picture.pixel = New pixel
picture\i = CreateImage(block_size, block_size)
GrabImage picture\i,count2,count1
picture\x# = ((320 - (width / 2))) + count2
picture\sx# = picture\x#
picture\y# = ((240 - (height / 2))) + count1
picture\sy# = picture\y#
picture\mx# = Rnd(-2.0,2.0)
picture\my# = Rnd(-2.0,2.0)
Next
Next
SetBuffer BackBuffer()
; main stuff
While Not KeyHit(1)
Cls
; space bar sets block state - move blocks / restore blocks
If KeyHit(57) Then
If block_state = 0 Then block_state = 1
If block_state = 2 Then block_state = 0
End If
; move the blocks about
If block_state = 0 Then
For picture.pixel = Each pixel
picture\sx# = picture\sx# + picture\mx#
picture\sy# = picture\sy# + picture\my#
If picture\sx# < 0 - block_size Then picture\sx# = 639
If picture\sx# > 639 Then picture\sx# = 0 - block_size
If picture\sy# < 0 - block_size Then picture\sy# = 479
If picture\sy# > 479 Then picture\sy# = 0 - block_size
DrawBlock picture\i, picture\sx#, picture\sy#
Next
End If
; how much do we move each pixel each frame to restore the image ?
If block_state = 1
restore_count = 0
For picture.pixel = Each pixel
picture\rsx# = ((picture\x# - picture\sx#) / restore_frames)
picture\rsy# = ((picture\y# - picture\sy#) / restore_frames)
Next
block_state = 2
End If
; restore the image
If block_state = 2 Then
If restore_count < restore_frames Then
For picture.pixel = Each pixel
DrawBlock picture\i,picture\sx#, picture\sy#
picture\sx# = picture\sx# + picture\rsx#
picture\sy# = picture\sy# + picture\rsy#
Next
restore_count = restore_count + 1
Else
For picture.pixel = Each pixel
DrawBlock picture\i, picture\x#, picture\y#
Next
End If
End If
Flip
Wend
End
|
| ||
| Thanks for all the info, I have got something working now with physics, it's not fast but im not looking for a real time solution anyway. I`ll post a demo when my webspace is back up. |