こんにちは。きんくまです。
ブログは普段は月曜と木曜アップの予定なんですが、夏休み進行ということで本日アップです。
どうでもいい話なんですが、テレ朝の「ダンディ・ダディ」というドラマを見ています。
これが面白くて。いつも笑ってみております。
舘ひろしが主演で、子供の恋愛に一喜一憂するお父さんの役です。
似た設定でちょっと前にやっていた「パパとムスメの7日間」というのもあるですが、これもいつもしょーもない感じで面白かったです。新垣ちゃんが可愛かった。
さて、本題です。
今回、iPhoneの動きで反転する動きがあります。それを作ってみようと思いました。
以前Player10の機能を使って同様のことをやろうとしたんですが、
PV3Dを使うとすぐにできるんですね。
と書きつつ、ちょっとだけつまりました。
表側と裏側で180°のオフセットをとってるんですが、
反転した後はrotationXのオフセットがいらないことに気がつかずに試行錯誤してました。
板をクリックすると反転します。
動きのポイントは単に回すだけじゃなくて、少し後ろにひっこめるようにするところだと思います。反転モーション中に、角度に応じてz座標をサインカーブを描くようにしました。
それで3Dはテクスチャが命ということで、次回はこれに動きをつけたテクスチャを使いたいと思います。
テクスチャ部分の制作中のもの。
PV3Dのチュートリアル集のこのページはものすごく勉強になります。
>> http://pv3d.org/sitemap/
以下ソースです。
package { import caurina.transitions.Tweener; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.MovieAssetMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; public class MyBasic extends BasicView { public var sw:Number; public var sh:Number; public var frontPlane:Plane; public var backPlane:Plane; public var planeSet:DisplayObject3D; public var isFront:Boolean = true; public var startBtn:MovieClip; public function MyBasic() { startBtn.addEventListener(MouseEvent.CLICK, init); } private function init(e:MouseEvent):void { startBtn.visible = false; startBtn.removeEventListener(MouseEvent.CLICK, init); sw = stage.stageWidth / 2; sh = stage.stageHeight / 2; viewport.interactive = true; var mat1:ColorMaterial = new ColorMaterial(0xff0000, 1, true); var mat2:ColorMaterial = new ColorMaterial(0x00ff00, 1, true); frontPlane = new Plane(mat1, 350, 500, 10, 10); backPlane = new Plane(mat2, 350, 500, 10, 10); planeSet = new DisplayObject3D(); backPlane.rotationY = 180; planeSet.addChild(frontPlane); planeSet.addChild(backPlane); scene.addChild(planeSet); frontPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, objOverHD); frontPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, objOutHD); frontPlane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, objClickHD); backPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, objOverHD); backPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, objOutHD); backPlane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, objClickHD); camera.z = -600; startRendering(); } private function objClickHD(e:InteractiveScene3DEvent):void { isFront = !isFront; var targetDeg:Number = isFront ? 0 : 180; if (Tweener.isTweening(planeSet)) { Tweener.removeTweens(planeSet); } Tweener.addTween(planeSet, { rotationY:targetDeg, time:0.6, transition:'easeOutQuad', onUpdate:flippingHD }); } private function flippingHD():void { planeSet.z = Math.sin(planeSet.rotationY / 180 * Math.PI) * 300; } private function objOverHD(e:InteractiveScene3DEvent):void { viewport.buttonMode = true; } private function objOutHD(e:InteractiveScene3DEvent):void { viewport.buttonMode = false; } override protected function onRenderTick(event:Event = null):void { movePlaneSet(); renderer.renderScene(scene, camera, viewport); } private function movePlaneSet():void { if (Tweener.isTweening(planeSet)) { return; } var offsetDeg:Number = isFront ? 0 : 180; var degX:Number = (mouseY - sh) / sh * 20; var degY:Number = -(mouseX - sw) / sw * 60; planeSet.rotationX += (degX - planeSet.rotationX) * 0.1; planeSet.rotationY += (degY + offsetDeg - planeSet.rotationY) * 0.1; } } }
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ