Dissolve Image?

Blitz3D Forums/Blitz3D Programming/Dissolve Image?

CopperCircle(Posted 2006) [#1]
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.


Dreamora(Posted 2006) [#2]
Types is mainly the magic behind.

A 3D array with 2 fields on the 3rd dimension would work as well (current speed)


jfk EO-11110(Posted 2006) [#3]
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.


BlackJumper(Posted 2006) [#4]
Have a look at big10p's exploding mesh demo...

http://www.blitzbasic.com/codearcs/codearcs.php?code=680


jimmyx(Posted 2006) [#5]
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


Qube(Posted 2006) [#6]
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



CopperCircle(Posted 2006) [#7]
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.