Away3D Lite:Basic_LoadModel

本文介绍如何使用Away3D加载3DS模型文件,并实现模型的材质切换及子模型的旋转操作。通过实例展示了Away3D在模型加载方面的特点,并与PV3D进行了对比。

开启Debug模式:具体什么作用,尚不知

// Class for emmiting debuging messages, warnings and errors.
Debug.active = true;

 

引入外部文件创建材质:

[Embed(source="assets/fskingr.jpg")]
private var GreenPaint:Class;

//ferrari texture
[Embed(source="assets/fskin.jpg")]
private var RedPaint:Class;
		
//ferrari texture
[Embed(source="assets/fskiny.jpg")]
private var YellowPaint:Class;
		
//ferrari texture
[Embed(source="assets/fsking.jpg")]
private var GreyPaint:Class;

// Cast: Helper class for casting assets to usable objects
materialArray = [Cast.material(GreenPaint), Cast.material(RedPaint), Cast.material(YellowPaint), Cast.material(GreyPaint)];

 

创建一个ObjectContainer3D对象和Max3DS对象并赋值:

// Max3DS:File loader for the 3DS file format.
// 仅仅关联到该加载3DS文件,不能直接呈现到scene中去,也没有各种rotation动作
private var max3ds:Max3DS;

// Loader3D:Abstract loader class used as a placeholder for loading 3d content
// 3D内容的加载器
private var loader:Loader3D;

 // 3d object container node for other 3d objects in a scene.
// 真正展示到场景中的对象,loader加载成功后会对其赋值
private var model:ObjectContainer3D;

max3ds = new Max3DS();
max3ds.scaling = 100;
// Controls the automatic centering of geometry data in the model, improving culling and the accuracy of bounding dimension values.
// 优化,精确的属性,不设置为true的话,模型可能会出现异常,例如部件错位
max3ds.centerMeshes = true;
// Overrides all materials in the model.
// 模型所用到的材质
max3ds.material = materialArray[materialIndex];

loader = new Loader3D();
loader.addEventListener(Loader3DEvent.LOAD_SUCCESS, onSuccess);
// Loads and parses a 3d file format.
// 加载解析3DS文件,加载成功,调用onSuccess函数继续处理
loader.loadGeometry("assets/f360.3ds", max3ds);

// 加载模型到场景中去,onSuccess函数里调用scene.addChild(model);亦可
scene.addChild(loader);

private function onSuccess(event:Event):void
{
    // loader.handle:Returns a 3d object relating to the currently visible model.
    // 给model赋值
	model = loader.handle as ObjectContainer3D;
	
	model.rotationX = -90;
	
	model.addEventListener(MouseEvent3D.MOUSE_UP, onClickModel);
}
 

点击model改变材质:

model.materialLibrary.getMaterial("fskin").material = materialArray[materialIndex];
 

旋转模型的子模型(轮胎):

if (model) {
	for each (var object:Object3D in model.children) {
		if (object.name.indexOf("wheel") != -1)
			object.rotationX += 10;
	}
}
 

从这个example里就可以看出away3d同pv3d的不同之处了,away3d在加载使用外部模型的时候确实没有pv3d这么简便


Warning (14284): Synthesized away the following node(s): Warning (14285): Synthesized away the following RAM node(s): Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[0]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[1]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[2]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[3]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[4]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[5]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[6]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[7]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[8]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[9]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[10]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[11]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[12]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[13]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[14]" Warning (14320): Synthesized away node "ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|altsyncram:altsyncram_component|altsyncram_57g1:auto_generated|q_a[15]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[0]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[1]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[2]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[3]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[4]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[5]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[6]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[7]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[8]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[9]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[10]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[11]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[12]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[13]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[14]" Warning (14320): Synthesized away node "FIFO_16X2048:FIFO_16X2048|FIFO_16_2048:FIFO_16_2048_inst|scfifo:scfifo_component|scfifo_nq31:auto_generated|a_dpfifo_u041:dpfifo|dpram_t911:FIFOram|altsyncram_e6k1:altsyncram1|q_b[15]" Warning (12241): 3 hierarchies have connectivity warnings - see the Connectivity Checks report folder
09-29
你遇到的警告信息来自 **Intel Quartus Prime** 综合工具,属于 FPGA 设计流程中的综合(Synthesis)阶段。我们来逐条分析这些警告,并给出解决方案。 --- ### ❗ 警告解释 #### 🔹 `Warning (14284): Synthesized away the following node(s):` #### 🔹 `Warning (14285): Synthesized away the following RAM node(s):` 这表示 Quartus 在综合过程中 **移除了某些 RAM 节点**。也就是说,你设计中定义的 RAM 模块(如 `altsyncram` 或 `scfifo`)被“优化掉”了,没有实际生成硬件资源。 #### 🔹 `Warning (14320): Synthesized away node "..."` 具体列出了哪些信号或节点被移除,例如: ``` ONE_PORT_RAM_16X2048:ONE_PORT_RAM_16X2048|RAM0:RAM0_inst|... ``` 说明你的单端口 RAM 实例和 FIFO 内部使用的双口 RAM 都被综合掉了。 --- ### 🚩 常见原因 RAM/FIFO 被“synthesized away”的主要原因如下: 1. **未连接输出端口(q)** - 如果 RAM 的读出数据线 `q[]` 没有连接到任何逻辑,Quartus 会认为该 RAM 是无用的,从而将其删除。 2. **写使能(wren)始终为低 / 地址/数据未驱动** - 若写使能信号恒为 0,或者地址、数据输入未被赋值,则整个 RAM 不会被访问 → 被优化。 3. **FIFO 输出未使用** - 类似地,如果 FIFO 的 `q`, `empty`, `full` 等输出未被后续逻辑使用,也会被移除。 4. **复位期间初始化问题或编译选项限制** - 某些配置下,若 RAM 初始化文件(.mif)加载失败或路径错误,也可能导致实例化失败。 5. **仿真模型与综合模型不一致** - 使用了行为级描述但未正确调用 IP 核。 --- ### ✅ 解决方案 #### ✅ 检查 RAM 和 FIFO 的连接是否完整 以你使用的 `ONE_PORT_RAM_16X2048` 和 `FIFO_16X2048` 为例,确保以下关键信号都已正确连接: ##### 示例:One-Port RAM 连接检查(Altera/Intel altsyncram) ```verilog // 示例:正确实例化的单端口 RAM module ONE_PORT_RAM_16X2048 ( input clock, input wren, input [11:0] address, // 2048 = 2^11 -> 11 bits; maybe 12? input [15:0] data, output reg[15:0] q ); altsyncram #( .width_a(16), .widthad_a(11), // 地址宽度 .numwords_a(2048), .operation_mode("SINGLE_PORT"), .outdata_reg_a("UNREGISTERED"), // 注意寄存器设置 .init_file(""), // 可选初始化文件 .read_during_write_mode_a("NEW_DATA_NO_NBE_READ") ) RAM0_inst ( .clock0(clock), .wren_a(wren), .address_a(address), .data_a(data), .q_a(q) ); // ⚠️ 必须在顶层设计中使用 q!否则会被优化掉 endmodule ``` > 💡 关键点:`q` 输出必须连接到其他模块或顶层输出端口! #### ✅ 检查 FIFO 使用情况 如果你用了 `scfifo`,要确认: - `q` 是否连接? - `empty` 是否用于控制读取? - `full` 是否用于控制写入? 示例片段: ```verilog wire [15:0] fifo_out; wire fifo_empty, fifo_full; FIFO_16X2048 your_fifo_inst ( .data(data_in), .wrreq(wr_req), .rdreq(rd_req), .clock(clk), .q(fifo_out), .empty(fifo_empty), .full(fifo_full) ); // 必须使用 fifo_out,比如驱动 LED 或发送给其他模块 assign some_output = fifo_out; // 即使只是测试也要用! ``` #### ✅ 强制保留信号(防止优化) 如果只是为了调试而想保留 RAM/FIFO,即使未使用其输出,可用 `(* keep *)` 属性阻止优化: ```verilog output [15:0] q; reg [15:0] q /* synthesis keep */; // 或者用综合指令保留整个模块/信号 // synthesis read_comments_as_HDL on // (* keep *) wire [15:0] q_debug = q_a; ``` 也可以在 Quartus 设置中关闭 RAM 移除优化: #### ✅ Quartus 设置:禁止移除未使用模块 进入: ``` Assignments → Settings → Compiler Settings → Advanced Settings (Synthesis) → Remove unreferenced signals: 设置为 "None" ``` 或者添加 `.qsf` 配置: ```tcl set_global_assignment -name SYNTHESIS_EFFORT STANDARD set_global_assignment -name OPTIMIZATION_MODE "BALANCED" set_global_assignment -name REMOVE_REDUNDANT_LOGIC_CELLS OFF ``` #### ✅ 检查 MIF 文件路径(如有初始化需求) 如果 RAM 应从 `.mif` 文件初始化,请确保: - `.mif` 文件在项目目录中 - 路径正确(相对或绝对) - 在 IP 参数中指定 `.mif` 名称 --- ### ✅ 如何验证 RAM 是否真正生成? 查看: ``` Compilation Report → Analysis & Synthesis → Entity Hierarchies → 查看是否有 ram_block 或 altsyncram 实例存在 ``` 或者: ``` Fitter → Resource Section → Memory Summary ``` 应显示 MLAB 或 M20K 块的使用数量。 如果没有出现,说明 RAM 真的没生成。 --- ### ✅ 总结解决步骤 | 步骤 | 操作 | |------|------| | 1 | 检查 RAM/FIFO 所有 I/O 是否连接,尤其是输出 `q` | | 2 | 确保 `wren`, `rdreq`, `wrreq` 等控制信号不是常量 | | 3 | 在顶层设计中“使用” RAM/FIFO 的输出(哪怕只是 assign 到一个 wire) | | 4 | 添加 `/* synthesis keep */` 属性防止优化 | | 5 | 修改 Quartus 设置禁用自动移除 | | 6 | 检查 `.mif` 文件是否存在且路径正确 | | 7 | 编译后查看 Resource Usage 报告确认 RAM 是否生成 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值