alternativa3d7.7 实现相机追尾,紧跟模型后边

本文探讨了游戏开发中的3D场景实时渲染技术,包括如何使用特定的库和框架来创建交互式的游戏环境,实现角色移动、相机控制和物体碰撞检测等功能。详细介绍了如何通过键盘和鼠标输入来控制游戏中的物体,并实现实时的场景更新。
方法一:

package
{
import alternativa.engine3d.controllers.SimpleObjectController;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.primitives.Box;
import alternativa.engine3d.primitives.Plane;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

public class TestCameraController extends Sprite
{
private var rootContainer:Object3DContainer = new Object3DContainer();
private var view:View;
private var camera:Camera3D;
private var box:Box;
private var nextX:Number = 0;
private var nextY:Number = 0;
private static const speed:uint = 10;
private static const RADIAN:Number = Math.PI/180;
private var currenRadian:Number = 90*RADIAN;
private var cameraController:CameraControllerAlternativa3d7;

public function TestCameraController()
{
if (this.stage)
this.init();
else
this.addEventListener(Event.ADDED_TO_STAGE, init);
this.stage.addEventListener(Event.ENTER_FRAME, onRenderTick);
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
this.stage.addEventListener(KeyboardEvent.KEY_UP,keyUp);
this.stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
}

private function init(e:Event=null):void
{
this.removeEventListener(Event.ADDED_TO_STAGE,init);
this.stage.align = StageAlign.TOP_LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.view = new View(this.stage.width,this.stage.height);
this.camera = new Camera3D();
this.camera.y = -300;
this.camera.z = 100;
this.camera.rotationX = -100*RADIAN;
this.camera.view = view;
this.addChild(camera.view);
this.addChild(camera.diagram);
this.rootContainer.addChild(camera);

//plane
var materialPlane:FillMaterial = new FillMaterial(0x598FBB, 1, 1);
var plane:Plane = new Plane(4000,4000,10,10);
plane.setMaterialToAllFaces(materialPlane);
this.rootContainer.addChild(plane);
//box
var materialBox:FillMaterial = new FillMaterial(0x0000FF, 1, 1);
box = new Box(50,100,25);
box.setMaterialToAllFaces(materialBox);
this.rootContainer.addChild(box);

// cameraController = new CameraControllerAlternativa3d7(this.stage,box,10,5);
// cameraController.bindKey(Keyboard.RIGHT, SimpleObjectController.ACTION_YAW_LEFT);
// cameraController.bindKey(Keyboard.LEFT, SimpleObjectController.ACTION_YAW_RIGHT);
// cameraController.mouseSensitivity = 0;
}

private function keyDown(e:KeyboardEvent):void{

switch(e.keyCode)
{
case "W".charCodeAt():
case Keyboard.UP:
nextX = this.box.x + speed * Math.cos(this.currenRadian);
nextY = this.box.y + speed * Math.sin(this.currenRadian);
break;

case "S".charCodeAt():
case Keyboard.DOWN:
nextX = this.box.x - speed * Math.cos(this.currenRadian);
nextY = this.box.y - speed * Math.sin(this.currenRadian);
break;

case "A".charCodeAt():
case Keyboard.LEFT://逆时钟为负
//box.rotationZ += RADIAN;
box.rotationZ += RADIAN;
this.currenRadian += RADIAN;
if(this.box.rotationZ > 360*RADIAN) box.rotationZ = 360*RADIAN - box.rotationZ;
//camera
//this.camera.rotationZ += RADIAN;
//if(this.camera.rotationZ > 360*RADIAN) this.camera.rotationZ = 360*RADIAN - this.camera.rotationZ;
break;

case "D".charCodeAt():
case Keyboard.RIGHT://顺时钟为正
//box.rotationZ -= RADIAN;
box.rotationZ -= RADIAN;
this.currenRadian -= RADIAN;
if(box.rotationZ > 360*RADIAN) box.rotationZ = 360*RADIAN + box.rotationZ;
//camera
//this.camera.rotationZ -= RADIAN;
//if(this.camera.rotationZ > 360*RADIAN) this.camera.rotationZ = 360*RADIAN + this.camera.rotationZ;
break;

}

}

private function keyUp(e:KeyboardEvent):void{

switch(e.keyCode)
{
case "W".charCodeAt():
case Keyboard.UP:

break;

case "S".charCodeAt():
case Keyboard.DOWN:

break;

case "A".charCodeAt():
case Keyboard.LEFT:

break;

case "D".charCodeAt():
case Keyboard.RIGHT:

break;

}

}


private function mouseMove(evt:MouseEvent):void
{

}

private function onRenderTick(e:Event=null):void
{
this.cameraUpdate();
this.boxUpdate();
//this.cameraController.update();
}

private function cameraUpdate():void
{
this.camera.view.width = this.stage.stageWidth;
this.camera.view.height = this.stage.stageHeight;
this.camera.render();
//追尾
this.camera.rotationZ = this.box.rotationZ;
this.camera.x = this.box.x - 300 * Math.sin(this.box.rotationZ + 180 * Math.PI / 180);
this.camera.y = this.box.y + 300 * Math.cos(this.box.rotationZ + 180 * Math.PI / 180);
//this.camera.z = 100;
}

private function boxUpdate():void
{
box.x = this.nextX;
box.y = this.nextY;
}
}

}


方法二:用容器把模型和相机绑定起来

package
{
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.primitives.Box;
import alternativa.engine3d.primitives.Plane;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

public class BoxCameraController extends Sprite
{
private var rootContainer:Object3DContainer = new Object3DContainer();
private var boxCameraContainer:Object3DContainer = new Object3DContainer();
private var view:View;
private var camera:Camera3D;
private var box:Box;
private var nextX:Number = 0;
private var nextY:Number = 0;
private static const speed:uint = 10;
private static const RADIAN:Number = Math.PI/180;
private var currenRadian:Number = 90*RADIAN;

public function BoxCameraController()
{

if (this.stage)
this.init();
else
this.addEventListener(Event.ADDED_TO_STAGE, init);
this.stage.addEventListener(Event.ENTER_FRAME, onRenderTick);
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
}

private function init(e:Event = null):void
{

this.removeEventListener(Event.ADDED_TO_STAGE,init);
this.stage.align = StageAlign.TOP_LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.view = new View(this.stage.width,this.stage.height);
this.camera = new Camera3D();
this.camera.y = -250;
this.camera.z = 100;
this.camera.rotationX = -100*RADIAN;
this.camera.view = view;
this.addChild(camera.view);
this.addChild(camera.diagram);
this.boxCameraContainer.addChild(camera);

//plane
var materialPlane:FillMaterial = new FillMaterial(0x598FBB, 1, 1);
var plane:Plane = new Plane(4000,4000,10,10);
plane.setMaterialToAllFaces(materialPlane);
this.rootContainer.addChild(plane);
//box
var materialBox:FillMaterial = new FillMaterial(0x0000FF, 1, 1);
box = new Box(50,100,25);
//box.z = 200;
box.setMaterialToAllFaces(materialBox);
this.boxCameraContainer.addChild(box);
this.rootContainer.addChild(this.boxCameraContainer);
}

private function keyDown(e:KeyboardEvent):void{

switch(e.keyCode)
{
case "W".charCodeAt():
case Keyboard.UP:
nextX = this.boxCameraContainer.x + speed * Math.cos(this.currenRadian);
nextY = this.boxCameraContainer.y + speed * Math.sin(this.currenRadian);
break;

case "S".charCodeAt():
case Keyboard.DOWN:
nextX = this.boxCameraContainer.x - speed * Math.cos(this.currenRadian);
nextY = this.boxCameraContainer.y - speed * Math.sin(this.currenRadian);
break;

case "A".charCodeAt():
case Keyboard.LEFT://逆时钟为负
boxCameraContainer.rotationZ += RADIAN;
this.currenRadian += RADIAN;
if(this.boxCameraContainer.rotationZ > 360*RADIAN) boxCameraContainer.rotationZ = 360*RADIAN - boxCameraContainer.rotationZ;
break;

case "D".charCodeAt():
case Keyboard.RIGHT://顺时钟为正
boxCameraContainer.rotationZ -= RADIAN;
this.currenRadian -= RADIAN;
if(boxCameraContainer.rotationZ > 360*RADIAN) boxCameraContainer.rotationZ = 360*RADIAN + boxCameraContainer.rotationZ;
break;
}

}

private function onRenderTick(e:Event):void
{
this.camera.view.width = this.stage.stageWidth;
this.camera.view.height = this.stage.stageHeight;
camera.render();
boxCameraContainer.x = this.nextX;
boxCameraContainer.y = this.nextY;
}

}
}
内容概要:本文围绕“考虑电动汽车聚合可调节能力的含波动性电源电氢耦合系统多目标优化运行”展开研究,提出了一种基于Matlab代码实现的多目标优化模型。该模型深度融合电-氢耦合系统与高比例波动性可再生能源(如风电、光伏),充分挖掘电动汽车(EV)集群作为移动储能单元的灵活调节潜力,通过聚合调控提升系统对新能源的消纳能力与运行经济性。研究系统构建了电动汽车可调度能力、电解水制氢与储氢动态过程、多能源协同互补的优化调度框架,并结合智能优化算法实现经济性、低碳性与运行稳定性等多重目标的协同优化。文中配套提供了完整的Matlab仿真代码、相关数据及可能的论文支撑材料,极大地方便了模型的复现、验证与后续深化研究。; 适合人群:具备电力系统、综合能源系统、优化理论或新能源技术等相关领域基础知识的研究生、科研人员,以及从事新型电力系统规划、清洁能源消纳与智慧能源管理的工程技术人员。; 使用场景及目标:①开展高渗透率可再生能源接入下的综合能源系统多目标优化调度研究;②探究电动汽车集群在电网削峰填谷、平抑新能源出力波动及提供辅助服务方面的应用价值与潜力;③学习并掌握电氢耦合系统的建模方法、多目标优化求解技术及其在Matlab/Simulink环境下的仿真实现流程。; 阅读建议:此资源不仅提供可运行的代码,更蕴含了前沿的科研思路与创新方法,建议读者结合所提供的代码、数据与可能的论文文档,系统性地学习从问题建模、算法设计到仿真分析的完整科研过程,并重点关注其中关于需求侧资源聚合、多能互补协同与绿色低碳运行的核心理念。
内容概要:本文档名为《经济学期刊论文复现:数字化转型能促进企业的高质量发展吗》,表面上聚焦于经济学领域中数字化转型对企业高质量发展影响的研究,实则是一份涵盖多学科交叉的科研仿真代码资源合集。资源以Matlab、Simulink、Python为主要工具,系统整合了电力系统仿真、微电网优化调度、路径规划、信号处理、图像处理、机器学习预测模型等方向的可复现算法与仿真模型。尽管标题指向经济学实证分析,但内容重心在于提供顶级期刊论文的复现代码,如企业全要素生产率(TFP)测算方法(OL、FE、LP、OP、GMM)、风光储氢系统优化、需求响应与综合能源系统调度等,并融合智能优化算法与深度学习技术进行数据建模与预测分析,体现出极强的工程化与科研实用性。; 适合人群:具备一定编程基础,熟练掌握Matlab/Simulink/Python等仿真工具,从事工程仿真、经济实证研究或交叉学科科研工作的研究生、高校教师及科研人员。; 使用场景及目标:① 复现经济学顶刊论文中的计量经济模型,深入探究数字化转型对企业全要素生产率的影响机制;② 借助提供的代码资源开展电力系统故障仿真、微电网优化、多能系统调度等科研项目的算法验证与仿真分析;③ 应用机器学习与深度学习模型完成负荷预测、风电光伏出力预测、电池健康状态评估等典型实证任务; 阅读建议:此资源虽冠以经济学论文之名,实质为多领域高价值仿真代码集成,建议读者依据自身研究方向筛选适配内容,优先关注“顶刊复现”“论文复现”类项目,结合配套数据与代码进行实证推演,并通过公众号“荔枝科研社”获取完整资料与持续技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值