Skip to main content
1-Visitor
March 5, 2020
Solved

How to scale in and scale out 3D images on triggering visible function

  • March 5, 2020
  • 1 reply
  • 1620 views

 Is it done by Javascript or can CSS animations be applied to 3D images

Best answer by RolandRaytchev

Hi @Ace_Rothstein_310668 ,

 

I review the video link what you mentioned in your post. Unfortunately I do not know exactly how it was exactly implemented  here  , but I think this effect could be done by moving the 3dImage widget e.g. in Z direction and scaling the 3dImage at the same. time.

I did test it in a simple project, and I think it works.

 

2020-03-10_12-08-59.jpg

 

So have only 2 widgets 3DImage-1 Widget and toggle-1 Widget. So, I used the click event of the toggle to FlyIn and FlyOut effect. It is not perfect but works.

I used the following code:

 

 

//===============================
////
var zMax=2
var zMin=0
var dist = zMax - zMin

var moveTime=2000 //ms
var moveTimeStep=10 //ms
var distInt= dist/(moveTime/moveTimeStep)
var scaleFactor =0.92
var scaleMax=0.3
var scaleMin = scaleMax *( Math.pow(scaleFactor,(moveTime/moveTimeStep)))

//===============================
$scope.app.FlyIn = function(){
console.log("called app.FlayIn()")
$scope.setWidgetProp('3DImage-1', 'z',-zMax)
$scope.setWidgetProp('3DImage-1', 'scale',scaleMin)
$scope.setWidgetProp('3DImage-1', 'visible',true)
$scope.setWidgetProp('toggle-1', 'disabled',true)
var tt = setInterval(function(){ $scope.startFlayIn() }, moveTimeStep);
setTimeout(function() { clearInterval(tt); 
 $scope.setWidgetProp('3DImage-1', 'visible',true)
 $scope.setWidgetProp('3DImage-1', 'scale',scaleMax)
 $scope.setWidgetProp('toggle-1', 'disabled',false)
 }, moveTime);
 
}
//===============================
$scope.app.FlyOut = function(){
console.log("called app.FlayOut()")
$scope.setWidgetProp('3DImage-1', 'z', zMin)
$scope.setWidgetProp('3DImage-1', 'scale', scaleMax)
$scope.setWidgetProp('3DImage-1', 'visible',true)
$scope.setWidgetProp('toggle-1', 'disabled',true)
var tt = setInterval(function(){ $scope.startFlayOut() },moveTimeStep);
setTimeout(function() { clearInterval(tt); 
 $scope.setWidgetProp('3DImage-1', 'visible',false)
 $scope.setWidgetProp('toggle-1', 'disabled',false)
 }, moveTime);
}
//===============================
$scope.app.ClickAction = function(){
if($scope.view.wdg['toggle-1']['value']==false) $scope.app.FlyIn();
 else
 $scope.app.FlyOut();
}

/////////////////////////
 $scope.startFlayOut = function(){

 var newVal= parseFloat($scope.view.wdg['3DImage-1']['z']) -distInt
 $scope.setWidgetProp('3DImage-1', 'z', parseFloat(newVal))
 
 var newScale= parseFloat($scope.view.wdg['3DImage-1']['scale'])*scaleFactor
 $scope.setWidgetProp('3DImage-1', 'scale', parseFloat(newScale))
 $scope.$applyAsync()

}
//=============================
/////////////////////////
 $scope.startFlayIn = function(){
 var newVal= parseFloat($scope.view.wdg['3DImage-1']['z']) +distInt
 $scope.setWidgetProp('3DImage-1', 'z', parseFloat(newVal)) 
 var newScale= parseFloat($scope.view.wdg['3DImage-1']['scale'])/scaleFactor
 $scope.setWidgetProp('3DImage-1', 'scale', parseFloat(newScale))
 $scope.$applyAsync()
}

 

I attached also the test project

1 reply

5-Regular Member
March 5, 2020

Can you describe your use case in detail?

1-Visitor
March 6, 2020

In the example mentioned here: (https://www.youtube.com/watch?v=ERa8sN837h0. ) Half way in the middle of the experience, there is an effect added to the 3D images which makes it appear to scale up after triggering some button. 

21-Topaz I
March 10, 2020

Hi @Ace_Rothstein_310668 ,

 

I review the video link what you mentioned in your post. Unfortunately I do not know exactly how it was exactly implemented  here  , but I think this effect could be done by moving the 3dImage widget e.g. in Z direction and scaling the 3dImage at the same. time.

I did test it in a simple project, and I think it works.

 

2020-03-10_12-08-59.jpg

 

So have only 2 widgets 3DImage-1 Widget and toggle-1 Widget. So, I used the click event of the toggle to FlyIn and FlyOut effect. It is not perfect but works.

I used the following code:

 

 

//===============================
////
var zMax=2
var zMin=0
var dist = zMax - zMin

var moveTime=2000 //ms
var moveTimeStep=10 //ms
var distInt= dist/(moveTime/moveTimeStep)
var scaleFactor =0.92
var scaleMax=0.3
var scaleMin = scaleMax *( Math.pow(scaleFactor,(moveTime/moveTimeStep)))

//===============================
$scope.app.FlyIn = function(){
console.log("called app.FlayIn()")
$scope.setWidgetProp('3DImage-1', 'z',-zMax)
$scope.setWidgetProp('3DImage-1', 'scale',scaleMin)
$scope.setWidgetProp('3DImage-1', 'visible',true)
$scope.setWidgetProp('toggle-1', 'disabled',true)
var tt = setInterval(function(){ $scope.startFlayIn() }, moveTimeStep);
setTimeout(function() { clearInterval(tt); 
 $scope.setWidgetProp('3DImage-1', 'visible',true)
 $scope.setWidgetProp('3DImage-1', 'scale',scaleMax)
 $scope.setWidgetProp('toggle-1', 'disabled',false)
 }, moveTime);
 
}
//===============================
$scope.app.FlyOut = function(){
console.log("called app.FlayOut()")
$scope.setWidgetProp('3DImage-1', 'z', zMin)
$scope.setWidgetProp('3DImage-1', 'scale', scaleMax)
$scope.setWidgetProp('3DImage-1', 'visible',true)
$scope.setWidgetProp('toggle-1', 'disabled',true)
var tt = setInterval(function(){ $scope.startFlayOut() },moveTimeStep);
setTimeout(function() { clearInterval(tt); 
 $scope.setWidgetProp('3DImage-1', 'visible',false)
 $scope.setWidgetProp('toggle-1', 'disabled',false)
 }, moveTime);
}
//===============================
$scope.app.ClickAction = function(){
if($scope.view.wdg['toggle-1']['value']==false) $scope.app.FlyIn();
 else
 $scope.app.FlyOut();
}

/////////////////////////
 $scope.startFlayOut = function(){

 var newVal= parseFloat($scope.view.wdg['3DImage-1']['z']) -distInt
 $scope.setWidgetProp('3DImage-1', 'z', parseFloat(newVal))
 
 var newScale= parseFloat($scope.view.wdg['3DImage-1']['scale'])*scaleFactor
 $scope.setWidgetProp('3DImage-1', 'scale', parseFloat(newScale))
 $scope.$applyAsync()

}
//=============================
/////////////////////////
 $scope.startFlayIn = function(){
 var newVal= parseFloat($scope.view.wdg['3DImage-1']['z']) +distInt
 $scope.setWidgetProp('3DImage-1', 'z', parseFloat(newVal)) 
 var newScale= parseFloat($scope.view.wdg['3DImage-1']['scale'])/scaleFactor
 $scope.setWidgetProp('3DImage-1', 'scale', parseFloat(newScale))
 $scope.$applyAsync()
}

 

I attached also the test project