1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

анимация с помощью контроллеров

Тема в разделе "MAXScript", создана пользователем aly8, 15 сен 2009.

Модераторы: Savin Denis
  1. aly8

    aly8 Активный участник

    С нами с:
    22.12.2005
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    10
    всем привет.
    Уважаемые спецы. Кто хорошо разбирается в контроллерах, подскажите пожалуйста, возможно ли такое реализовать с их помощью?
    осторожно - думает сек 15
    Код:
    (
    	try(delete objects)catch()
    	units.SystemType = #meters 
    	--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    	local startFrame = 0, 
    			endFrame = 10000, 
    			byFrame = 1, 
    			dt = 1.0d0/250.0d0, 
    			theObjCount = 10
    	--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    	local V = [0.0d0,0.0d0,0.0d0]
    	local  ArrObjects = #(), ArrVelosity = #(), ArrMass = #(), ArrPos = #(), SumArrPoss = #(), ArrRadius = #(), counter = 1
    	local theG = 6.67428d-011    
    	local Mz = 5.9736d+012
    	
    for i = 1 to theObjCount do
    (
    	local p = 20.0, a = 1.0
    	local SpOne = sphere pos:(random [p,p,p] [-p, -p, -p]) radius:(random 1 1) 
    	V = random [a,a,a] [-a, -a, -a]
    	append ArrObjects SpOne
    	append ArrVelosity V
    	append ArrMass (Mz*SpOne.radius)
    	append ArrPos SpOne.pos
    	append ArrRadius SpOne.radius
    	)	
    	
    for k = startFrame to endFrame by byFrame do 
    (
    			append SumArrPoss (deepCopy ArrPos)
    			for i = 1 to theObjCount do
    			(
    				local SumForceVector = [0.0d0, 0.0d0, 0.0d0]
    				local M1 = ArrMass[i]
    				for j = 1 to theObjCount do
    				(
    					local M2 = ArrMass[j]
    					if i != j do
    					(
    						local d1 = (length(ArrPos[j] - ArrPos[i]))^2
    						local d2 = (length(ArrPos[j] - ArrPos[i]))^4
    						local F1 = (theG*M2*M1/d1)*(normalize (ArrPos[j] - ArrPos[i]))
    						local F2 = -140.0*(theG*M2*M1/d2)*(normalize (ArrPos[j] - ArrPos[i]))
    						SumForceVector += (F1 + F2)
    						)
    					)
    					
    				for j = 1 to theObjCount do
    				(
    				local M2 = ArrMass[j]
    				local dV12 = length (ArrPos[j] - ArrPos[i])
    				local dRad = ArrRadius[i] + ArrRadius[j]
    					if i != j do
    					(
    						if dV12 <= dRad do 
    							(
    								local n = normalize (ArrPos[j] - ArrPos[i])
    								local t = normalize (cross  (cross n ArrVelosity[i]) n) 
    								local V1n = (normalize n)*(dot n ArrVelosity[i])
    								local V1t = (normalize t)*(dot t ArrVelosity[i])
    								V1n = V1n*(M1 - M2)/(M1+M2)
    								ArrVelosity[i] = V1n + V1t
    								) 
    						)
    					)
    					
    					ArrPos[i] += ArrVelosity[i]*dt
    					local dV = (normalize SumForceVector)*((length SumForceVector)*dt/M1)  
    					ArrVelosity[i] += dV
    				)-- end i
    			)--end k
    			
    animate on
    for t = startFrame to endFrame by byFrame do
    (
    	at time t
    		(
    			local numO = ArrObjects.count
    			for i = 1 to  numO do
    			(
    				ArrObjects[i].pos = SumArrPoss[counter][i]
    				)
    				counter += 1
    				)--end t
    			)
    animationRange = interval  startFrame  endFrame
    )
    
    Будет ли стоить овчинка выделки? (в плане скорости расчетов и др.)

    И еще. Возможно ли создать с помощью контроллеров взаимодействие в реальном времени(не timer)? К примеру, что бы можно было бросать шарик мышкой...?
     
Модераторы: Savin Denis

Поделиться этой страницей