[AR] ARToolKit 非官方安装指南(转载)

mikel阅读(1391)

安装并配置ARToolKit

  • 安装介绍
  • 编译toolkit
    • Windows
    • Linux/SGI Irix
    • Mac OS X
  • 运行例子和工具

安装介绍

ARToolKit的核心部分是一组可供应用程序调用的函数库。出于这个理 由,ARToolKit以源代码的方式发布。所以,你需要对它进行编译使之工作于你的平台。因此,你需要一个开发环境。开源开发环境(如GCC)可工作于 任何平台,你可以选择使用它来进行编译。当然,ARToolKit也支持在Microsoft Visual Studio中进行编译。

尽管ARToolKit为各种平台提供了类似的功能,安装方法却不尽相同。本文档的这个部分就是介绍如何在不同平台上安装并配置ARToolKit。

要安装并使用ARToolKit,你的机器、操作系统和平台必须满足基本要求。你的硬件必须 能获取视频流,并且CPU性能要足够好,以便同时进行图像的处理和显示。在软件方面需要满足一些(软件包的)依赖关系,否则会导致编译错误。主要的依赖关 系都是跨平台的(如OpenGL和GLUT),其他的依赖关系需要根据你自己的操作系统来满足(如DirectShow,V4L,QuickTime)

下面的部分将具体列出各操作系统中的依赖关系。

 

编译ToolKit

在Windows中编译

安装前的准备:

 需满足的软件包  安装指导
 开发环境  Microsoft Visual Studio 6和Microsoft Visual Studio .NET 2003都可以。也可以使用开源开发环境(例如Cygwin, http://www.cygwin.com/
DSVideoLib-0.0.8b-win32

在Win系统中,DSVideoLib是用来和摄像头驱动进行通信的包。ARToolKit 2.71需要使用DSVideoLib-0.0.8b或更新的版本。DSVideoLib的源代码和二进制包在ARToolKit downloads page on sourceforge可以下载到。

GLUT

确定GLUT运行包和SDK包都正确安装了。如果没有安装,可以在http://www.xmission.com/~nate/glut.html下载GLUT的二进制包。

在你的系统目录下(如c:\windows\system32)察看是否有glut32.dll,如果有,说明GLUT运行包已经被安装了。

在VC++的安装目录下(Include\gl\glut.h和Lib\glut32.lib)察看glut.h与glut32.lib是否存在。如果存在,说明GLUT SDK已经被安装了。

DirectX Runtime

Windows XP下是默认安装DirectX运行期包的。如果没有,请在microsoft网站下在安装DirectX 9.0b或更新版本的运行期包。

视频采集设备

安装摄像头和相关驱动。确保你的摄像头有VFW驱动或WDM驱动。确认方法是运行amcap.exe(这个程序在DirectX SDK中,Samples\C++\DirectShow\Bin目录下)。从Devices中可以察看到设备的状态(见下图)。

(可选项,用于VRML渲染) OpenVRML-0.14.3-win32

OpenVRML的源代码和二进制包可以在ARToolKit downloads page on sourceforge下载

编译ARToolKit:

按照以下步骤编译ARToolKit. Build:

1。将ARToolKit.zip解压到任一的目录下。为叙述方便,后面用{ARToolKit}代替该目录。

2。把DSVideoLib.zip也解压到{ARToolKit}。确保解压后的文件在名为“DSVL”的目录下。

3。把{ARToolKit}\DSVL\bin下的DSVL.dll和DSVLd.dll拷贝到{ARToolKit}\bin下。

4。把GLUT DLL拷贝到\Windows\System32\目录下,把GLUT SDK的.h和.lib文件放到VStudio的相应目录下(参考前表)

5。运行脚本{ARToolKit}\Configure.win32.bat,自动建立include/AR/config.h。

6。打开ARToolKit.sln(如果开发环境是VS.NET)或者ARToolkit.dsw(VS6的情况)。

7。编译toolkit.。

VRML渲染库和例子根据需要进行编译(libARvrml 和 simpleVRML)。步骤如下:

1。把OpenVRML.zip解压到{ARToolKit}。

2。把js32.dll从{ARToolKit}\OpenVRML\bin中拷贝到{ARToolKit}\bin。

3。在 VS配置管理器(configuration manager)中激活libARvrml和simpleVRML项目,然后编译。

 

运行例子和工具

当前的ARToolKit发布版本并没有要求把ARToolKit安装在特定的位置。在你编译自己的应用程序的时候,应该保证能找到ARToolKit。如果把ARToolKit编译为静态库,它将会被连接到所有你编译的程序中去。

为了使用ARToolKit,你需要有做一些“标志物”:例子程序使用的标志物放在 patterns目录下。你可以用把它打印出来。这些标志对你以后的开发也是有用的。ARToolKit需要一个不易形变的标志物,所以简单的做法是把标 志物粘在硬卡片上。然后,使用/bin目录下的graphicsTest来测试ARToolKit的图形部分是否正常工作。如果工作正常的话,应该显示一 个旋转的茶壶。

这个测试用来测试你的摄像头对ARToolKit的的图形模块的支持。图形模块使用了OpenGL。最小的允许幀率是15fps。低于这个数值会明显的限制ARToolKit渲染模块的正常工作(参考FAQ)。除此之外,还需要测试视频熟如是否正常、视频是否能显示。在/bin目录下的videoTest可以完成上述测试。如果没有错误的话,应该出现一个视频窗口,显示出摄像头采集的内容。这个测试用来测试你的摄像头对ARToolKit视频模块和图形模块的支持。

如果没有显示,可能是你的摄像头没有正确配置导致其不能正常工作(参考FAQ

第一个例子

  • 介绍
  • 运行ARToolKit
  • simpleTest的输出

介绍
当ARToolKit正常安装后,在/bin目录下有一个叫simpleTest(或simple,根据版本的不同名字有不同)的 程序可以展示ARToolKit的功能。不过你还需要把hiroPatt.pdf中的标志物打印出来。为了获得更好的效果,推荐把它粘在一个平的硬卡片 上。

在任何情况下,这个程序的输出都是一样的。所以本章的最后一个部分给出了程序在不同平台上的输出。

运行ARToolKit

运行方法,目前只有两种:一种是直接单/双击;一种是在控制台里运行。后一种要更好,因为从命令行启动会给出ARToolKit的错误和标准输出流信息(对ARToolKit来说很有用)。每个平台都提供了一个对话框用来在运行主AR循环之前设置视频。

Windows
双击simple.exe,会打开一个控制台窗口,当摄像头被检测出来后,会显示如下所示的对话框。也可以从“开始->程序->附件->命令行窗口”(winxp中文版)里运行simple.exe。

 

 

在这个对话框中,你可以设置视频输出的尺寸和格式。需要注意的是,最好使用与ARToolKit定位相同的格式,这样会会一些(RGB)。某些摄像头还允许你改变帧率。默认情况下,该对话框的设置与你先前视频输入的设置相同。此设置可能会引起一些问题(参考FAQ)。
Linux

如果你安装了gnome或KDE桌面环境,也可以直接双击运行simpleTest(不过这样运行看不到错误和输出流信息)。也可以在终端中运行它。如果你安装的是V4L,会显示如下的对话框。

在这个对话框中,你可以设置视频输出的尺寸和格式。需要注意的是,最好使用与ARToolKit定位相同的格式,这样会会一些(RGB)。某些摄像头还允许你改变帧率。默认情况下,该对话框的设置与你先前视频输入的设置相同。此设置可能会引起一些问题(参考FAQ).

MacOS

On MacOS X double click on the simple icon in the bin directory from your mac explorer. A console window will open and when the camera is detected the follow dialog will open. Otherwise start the Terminal program, go the bin directory and run simple.

The default Mac video dialog is really advanced so you can change a lot of elements, like video input, format or setup the video parameters (saturation, brightness). Furthermore, a preview window is displayed that help for the configuration. You need to notice that better the format is similar to ARToolKit tracking format, faster is the acquisition (RGB more efficient).
SGI

On SGI you need to use a terminal, go to the bin directory, and run simple.

simpleTest的输出

如果成功了,会显示一个视频窗口(如果遇到什么问题,可以参考FAQmailing list)。当你把摄像头对准标志物的时候(内部印有“hiro”的黑框),在视频窗口里,会看到有一个蓝色的方块出现在标志物上。 下图是运行的截图。当移动标志物的时候,虚拟图像(蓝色方块)会随标志物一起移动。

为了让虚拟物体显示在标志物上,必须能在视频中看到完整的黑框 和黑框中的图形。如果看不到虚拟物体,或者它时隐时现,可能是照明的问题。这个问题可以通过修改图像处理历程的阈值来解决。键入“t”,会提示你输入新的 阈值。阈值的取值范围为0~255,默认值是100。键入“d”会显示在主窗口下显示阈值图像(如下图)。在阈值图像中,会用红框把可能的定位区域标出 来。这样将便于你检查光照和阈值的设置是否合适。
键入“esc”退出程序并打印幀率信息。

[AR]完整版Flash Augmented Reality(增强现实)

mikel阅读(982)

Flash Augmented Reality

by shine on Jan.12, 2009, under ActionScript, 交互技术研究


Papervision – Augmented Reality (extended) from Boffswana on Vimeo.
大家对于VR都很熟悉,今天来讲讲AR···

AR全称为Augmented Reality(增强现实), 也被称之为混合现实。它通过电脑技术,将虚拟的信息应用到真实世界,真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。增强现实提供了在一 般情况下,不同于人类可以感知的信息。它不仅展现了真实世界的信息,而且将虚拟的信息同时显示出来,两种信息相互补充、叠加。在视觉化的增强现实中,用户 利用头盔显示器,把真实世界与电脑图形多重合成在一起,便可以看到真实的世界围绕着它。

增强现实借助计算机图形技术和可视化技术产生现实环境中不存在的虚拟对象,并通过传感技术将虚 拟对象准确“放置”在真实环境中,借助显示设备将虚拟对象与真实环境融为一体,并呈现给使用者一个感官效果真实的新环境。因此增强现实系统具有虚实结合、 实时交互、三维注册的新特点。

该技术在众多领域都有令人啧啧称奇的表现和体验感,而今天介绍的这个案例则是由AS3+WEBCAM完成的。

原地址:http://www.boffswana.com/news/

体验步骤:

1.下载并打印 这个PDF

2.确认您的摄像头已正确链接主机。

3.打开这个FLASH,等待加载完成,点击START开始体验。

将打印好的PDF放在摄像头前,如果步骤一切顺利的话您可以获得和文章开头视频中一样的效果。

点击此处下载源码

简单的来说就是通过摄像头实时分析视讯数据,解析中画面中的mark(就是制订好的那个二维码),比较分析得出二维码的方向,斜率,大小等数据,然 后通过视觉表现将该数据体现出来(视频中的怪兽就是用PV3D做的,你可以用其他的任何表现形式)。通过视频和FLASH DEMO,我们可以看到实时效率,多mark识别还尚待解决,目前还难以将此技术应用到FLASH项目的实际开发中。不过这种新型的人机交互形式还是让人 大呼过瘾。

你可以点击以下地址,了解一下该技术的应用领域

http://www.youtube.com/results?search_query=Augmented+Reality&search_type=&aq=f

http://www.designboom.com/weblog/cat/8/view/4912/augmented-reality-geisha.html

上面这跨快时代的宅男产品现提供破解版的下载地址

http://qiyeji.1stfreehosting.com/simple/index.php?t88.html

本人已经下载并且亲手制作以上道具,实际体验了一下,相当有意思。

实时运行的画面,我的显示器,我的桌面,我的钱包,我的小扑(当成摄像头垫子的那个)

这是我亲手制作的道具

[FlARToolKit]使用Flash实现增强现实

mikel阅读(859)

使用Flash实现增强现实

作者 Jon Rose译者 张龙

最近随着FLARToolKit的发布,增强现实(augmented reality)成为Flash社区的一个时髦词,它能将真实世界的对象与计算机生成的对象混合在一起。

Bartek Drozdz在其博客上科普了增强现实这个概念:

增强现实使用模式识别在视频上渲染3D图形。模式(又叫做标记)是一个矩形,你用其在相机前打印和定位。来自相机的流经过分析后由标记生成其捕获世界的坐标系统,接下来将该坐标系统发送到3D引擎,由后者在视频图像上渲染对象。

Duane Nickull在其博客上高度评价了FLARToolKit:

FLARToolKit是ARToolKit的AS3版本。ARToolKit是个可以创建增强现实的C程序库,然而兼容于Adobe Flash/Flex/AIR的FLARToolKit并不仅仅只是对之前C版本的移植。FLARToolKit是从Java版本移植过来的,其名称叫做NyARToolKit(经过nyatla的艰苦努力之后,现在NyARToolKit的执行速度要比原始的C版本快)。

构建基于浏览器应用的能力(包括增强现实)可以提高开发者对软件的认识。为了让开发者尽快上手,Adobe布道者Lee Brimelow发布了一个视频教程,其中包括GE的智能网格增强现实应用的示例。该示例在真实应用中使用了增强现实的叫声因子(wow factor),是绝佳的学习资源。

请阅读维基百科关于增强现实的说明来进一步了解其背景信息。 查看英文原文:Augmented Reality with Flash

[SWF]一个名字叫“Spark project”的超级强大的AS3库

mikel阅读(860)

这是一个超级大的项目工程,叫“Spark project”。在里面,你会找到不少实用的AS3类库,例如 swfassist ,一个解析SWF文件的库,支持Flash player 9,可以用as动态生成swf文件;又例如BMPDecoder、ICODecoder、PSDParser,从名字可以看出分别是用来解析bmp文件、 ico文件以及psd文件(没错,就是PhotoShop的源文件格式 PSD !);也有 AS3D 库,用来处理 3D 的;还有 SQLControls ,可以在AIR里方便操作SQLite数据库;还有很多很多…… 总体来说,包含以下这些相关:

  • 图形/颜色处理
  • 显示对象处理
  • 3D
  • 图像处理
  • 音频处理
  • 通信处理
  • 数学运算
  • 物理现象
  • 游戏算法
  • 时间日期处理
  • Flash Player/系统
  • 调试/测试
  • 二进制文件处理(bmp、ico、psd等等)
  • 其它…

        该项目是日本人做的,幸好有英文版本的页面。要学会用应该也需要一段时间了,想要研究他们的源代码,想必不是一件快乐事 🙂

项目首页http://www.libspark.org/
一堆AS3类库的英文版页面http://www.libspark.org/wiki/WikiStart/en

[Google]调试学习Google AJAX APs好去处

mikel阅读(827)

转载;http://www.xuewolf.com/?p=104
Google AJAX APIs Playground

Google AJAX APIs Playground

 

 

 

 

 

 

 

 

 

给调试和学习google api的朋友(绝大多数应该是地图类api吧!)一个调试和学习google api的好去处 — — Google AJAX APIs Playground.

本周一,Google发布了他的第二个版本。(看来老外清明节没有放三天假!)Google依然在跟我们搞笑,该工具在google自家的浏览器上无法正常使用。

这个版本加入了几个新特性:

1.支持断点。

2.用Firebug Lite做调试工具。

3.代码编辑框显示行号了。

4.可以直接编辑示例的HTML了。

[JQuery]JGTranslation:基于GOOGLE AJAX API的jQuery

mikel阅读(787)

转载:http://www.evlook.com/?p=126

平常上网遇见不懂单词和句子的时候,都喜欢用翻译软件来翻译一下,一般都用有道和google。这几天看google API的时候发现他好像早就提供了翻译的方法,不过好像没什么人用 :( 那我来用,呵呵。

写了个JQuery的小插件,结合google ajax API,提供页面文字的即时翻译功能,只要你指定要使用即时翻译的模块ID并指定翻译语言(如果不指定就按照操作系统默认语言进行翻译。)就能简单调用,非常方便。

如果你的blog是中文但是很多国外访问者那你可以用了试试,如果你的是英文blog,但是很多用中文的用户访问,你也可以使用。总之都是为了大家提供便利,呵呵。

可以选择下面的两段文字看看效果

曲曲折折的荷塘上面,弥望的是田田的叶子。叶子出水很高,像亭亭的舞女的裙。层层的叶子中间,零星地点缀着些白花,有袅娜地开着的,有羞涩地打着朵儿的; 正如一粒粒的明珠,又如碧天里的星星,又如刚出浴的美人。微风过处,送来缕缕清香,仿佛远处高楼上渺茫的歌声似的。这时候叶子与花也有一丝的颤动,像闪电 一般,霎时传过荷塘的那边去了。叶子本是肩并肩密密地挨着,这便宛然有了一道凝碧的波痕。叶子底下是脉脉的流水,遮住了,不能见一些颜色;而叶子却更见风 致了
Now that I’ve lost everything to you,
you say you want to start something new,
and it’s breaking my heart you’re leaving,
baby I’m grieving.
But if you wanna leave take good care,
hope you have a lot of nice things to wear,
but then a lot of nice things turn bad out there.

一、你必须引用google提供的API

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("language", "1");
</script>

二、翻译控件用到的默认样式

.JGTranslationPopStyle{font : normal normal normal 12px Verdana, Arial, Helvetica, sans-serif;border:2px solid #C5D7EF;background:#fff;}
.JGTranslationPopStyle p{padding:3px;margin:0px;line-height:150%;}
.JGTranslationPopStyle div{text-align:right;background:#E5ECF9;}

三、调用方法

$(selector).JGTranslation(options)
//可选参数
//Language:string(default = "userLanguage")
//PopStyle: string(default = "JGTranslationPopStyle")
//Branding:boolean(default = true)

示例:

<div id="TS1">
曲曲折折的荷塘上面,弥望的是田田的叶子。叶子出水很高,像亭亭的舞女的裙。层层的叶子中间,零星地点缀着些白花,有袅娜地开着的,有羞涩地打着朵儿的;正如一粒粒的明珠,又如碧天里的星星,又如刚出浴的美人。微风过处,送来缕缕清香,仿佛远处高楼上渺茫的歌声似的。这时候叶子与花也有一丝的颤动,像闪电一般,霎时传过荷塘的那边去了。叶子本是肩并肩密密地挨着,这便宛然有了一道凝碧的波痕。叶子底下是脉脉的流水,遮住了,不能见一些颜色;而叶子却更见风致了
</div>
<div id="TS2">
Now that I've lost everything to you,
you say you want to start something new,
and it's breaking my heart you're leaving,
baby I'm grieving.
But if you wanna leave take good care,
hope you have a lot of nice things to wear,
but then a lot of nice things turn bad out there.
</div>
$('#TS1').JGTranslation({Language:'en'})
$('#TS2').JGTranslation()


点击下载jquery.JGTranslation.js

[开发技巧]VS2008快捷键大全

mikel阅读(703)

Ctrl+m+Crtr+o折叠所有大纲
Ctrl+M+Crtr+P: 停止大纲显示
Ctrl+K+Crtr+C: 注释选定内容
Ctrl+K+Crtr+U: 取消选定注释内容
Ctrl+J : 列出成员 智能感知
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写
代码快捷键
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容
Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码
F12: 转到所调用过程或变量的定义
窗口快捷键
Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
trl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲
Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口
Ctrl+Tab: 活动窗体切换
Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写 

[FMS]FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Fl

mikel阅读(905)

转载:http://www.cnblogs.com/beniao/archive/2009/05/04/1447774.html
FMS开发中,经常会使用共享对象来同步用户和存储数据。对于实现广播文字信息实现聊天的支持非常强大,还可以跟踪用户的时时动作,在开发Flash多人在线游戏中的应用也非常广阔。

      在使用FMS开发共享对象时需要注意,只有使用Flash Media Interactive Server或Flash Media Development Server这两个版本时才能够创建和使用远程共享对象,来实现多客户端的应用程序之间共享数据。如果是使用的Flash Media Streaming Server版FMS是不能创建远程共享对象的,只能创建本地共享对象,类似于传统Web开发中的Cookie。

      使用共享对象(SharedObject)来开发时时文字聊天其实是很简单的,SharedObject可以跟踪和广播消息,连接到 SharedObject中的其中任何一个客户端改变了SharedObject中的数据,SharedObject就会将最新的数据广播到连接到它的所 有客户端。从某种角度可以理解为远程的SharedObject是一个同步很多用户的一个网络中心。下图为官方发布的SharedObject广播消息 图:

                  

      

      本文是通过实现一个简单的文字聊天来介绍FMS中的远程共享对象的使用,首先在FMS中建立好应用程序名,既在FMS的安装目录下的applications下建立一文件夹,来作为共享对象应用程序使用,如下图所示:

                  

      如上图,SharedObjectApp就是为实现聊天建立的一个FMS应用文件夹,其下的 sharedobjects/_definse_为成功创建远程对象后自动生成的目录。如果你所创建的为永久性的远程共享对象,则在该目录下还将会有一个 以.fso为扩展名的远程共享对象文件。

      要创建远程共享对象,首先需要连接到FMS应用,然后通过SharedObject.getRemote()方法来完成远程共享对象的创建,通过给远程共享对象添加同步事件监听,远程共享对象里的数据一但发生改变就会自动触发该事件,来实现同步数据。

private function onClick():void
{
    nc 
= new NetConnection();
    nc.connect(
"rtmp://192.168.1.101/SharedObjectApp");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
}
private function onNetStatusHandler(evt:NetStatusEvent):void
{
    
this.panChat.title+="("+evt.info.code+")";
    
if(evt.info.code=="NetConnection.Connect.Success")
    {
        
//创建一个远程共享对象
        
//参数:远程共享对象的名称 | 连接到的应用程序的URI | 远程共享对象是否为永久远程对象
        so = SharedObject.getRemote("RemotingSO",nc.uri,true); //将生成SO.fso
        
//远程对象(SharedObject)同步事件的监听
        so.addEventListener(SyncEvent.SYNC,onSyncHandler);
        
//远程共享对象连接到服务器
        so.connect(nc);
    }
}

 

      上面代码块实现了连接到FMS应用,成功连接后便创建远程共享对象(RemotingSO),同时还为远程共享对象添加了同步事件监听,通过onSyncHandler方法来处理事件。

      在继续实现聊天功能前,我们需要编写一个通用方法,该方法提供将一个数组里的数据转移到另一个数组,如下代码块:

private function convertArrayCollection(arrNew:ArrayCollection,arrOld:ArrayCollection):void
{
     arrNew.removeAll();
  
     
for(var i:int=0;i<arrOld.length ;i++)
     {
          arrNew.addItemAt(arrOld.getItemAt(i),i);
     }
}

 

      下面我们通过发送消息的流程开始,首先是发送消息,通过自定义Message类来封装消息内容:

 1 package flex.VO
 2 {
 3     public class Message
 4     {
 5         public var NickName:String;  //用户呢称
 6         public var Context:String;    //消息内容
 7         
 8         public function Message()
 9         {
10         }
11     }
12 }

 

      在发送消息的时候,通过此Message类来封装发送消息的数据,然后将其发布到FMS中的远程共享对象,更新远程共享对象中的数据。

private function onSend():void
{
    var tempCollection:ArrayCollection 
= new ArrayCollection();
    
if(so.data.msgCollection != null)
    {
        convertArrayCollection(tempCollection,so.data.msgCollection 
as ArrayCollection);
    }
    
    var msg:Message 
= new Message();
    msg.NickName 
= this.txtUser.text;
    msg.Context 
= this.txtMessage.text;
    tempCollection.addItem(msg);
    //更新远程共享对象中的属性值
    so.setProperty(
"msgCollection",tempCollection);
    
    
this.txtMessage.text="";
}

 

      实现了发送消息(将消息添加到远程共享对象并更新远程共享对象的属性值),如果有多个客户端连接到该远程共享对象,这时就回触发远程共享对象的同步事件,通过同步事件处理方法就可以将远程共享对象中的数据同步到客户端。如下代码块:

private function onSyncHandler(evt:SyncEvent):void
{
    
if(so.data.msgCollection!=null)
    {
        var tempCollection:ArrayCollection 
= new ArrayCollection();
        convertArrayCollection(tempCollection,so.data.msgCollection 
as ArrayCollection);
        
        
this.msgText.text="";
        
for(var index:int=0;index<tempCollection.length;index++)
        {
            var message:Object 
= tempCollection.getItemAt(index);
            var displayMessage:String 
= message.NickName+"说:"+message.Context;
            
this.msgText.text += displayMessage + "\n";
        }
    }
}

 

      如上便完成了整个文字聊天的功能开发,主要应用到的技术点就是通过远程共享对象来同步用户数据。下面为完整的Flex端代码:

完整的Flex端代码

 

      程序运行截图如下:

            

                                                  图1—-FMS状态图

            

                                                图2—-聊天客户端(张三)

                  

                                          图3—-聊天客户端(李四)

            

 

      如上图,在FMS应用目录下创建了一后缀为.fso的文件,这就是永久性的远程共享对象文件名。在使用远程共享的时候,根据实际需求来 确定是否使用永久性的远程共享对象,一般做聊天应用我个人建议使用临时远程共享对象(不生成.fso文件),要存储聊天记录可以通过其他方式来保存。

      详细大家可以查看官方提供的文档,在FMS的安装目录下就有,我的是D:\Adobe\Flash Media Server 3\documentation\flashmediaserver_AS3LR\index.html

 

      本文就介绍于此,如文中有什么问题,请大家拍砖指正。本文示例源代码下载

 

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

       

[JQuery]jquery.load()使iframe随内容改变而自适应高度

mikel阅读(972)

很高兴,终于使用JQuery实现了点击外部链接,更改iframe内容时,iframe的高度自适应问题。
失败的测试就不说了,来直接的。
两个链接和iframe:

Java代码
  1. <li><a href="selfinfo.jsp" target="c-c-iframe" title="个人信息" >个人信息</a></li>  
  2. <li><a href="modifypass.jsp" target="c-c-iframe" title="修改密码" >修改密码</a></li>  
  3.   
  4. <iframe src="init.jsp" id="c-c-iframe" name="c-c-iframe" width="500px;"  frameborder="0" scrolling="no" marginwidth="0" marginheight="0"></iframe>  

js代码:

Java代码
  1. <script type="text/JavaScript">  
  2. <!–  
  3. $(function(){  
  4.     $("#c-c-iframe").load(function(){         
  5.         $(this).height($(this).contents().find("#content").height() + 40);  
  6.     });  
  7.       
  8. });  
  9. –>  
  10. </script>  

这里的find("#content")是找出iframe内容文档中的id为content的高度(另外比如find("body")),并设置给iframe,
类似的还可以设置宽度,留给需要的朋友尝试吧。
这样就解决了iframe不会因为内容过大被挡住的问题(因为我设置了scrolling="no")。
PS:基本上我会优先考虑使用iframe来实现无刷新,兼容浏览器的后退按钮;而且使用iframe加载flash是很爽的,不用写什么js调用,object标签,还符合W3C标准。
2008年11月28日17:13:31 ,今天使用过程中根据实际情况进行了一下改良,代码如下:

Java代码
  1.     <script type="text/JavaScript">  
  2. <!–  
  3. $(function(){  
  4.     $("#workArea").load(function(){       
  5.         var height = $(this).contents().find("#box").height() + 40;  
  6. //这样给以一个最小高度  
  7.         $(this).height( height < 400 ? 400 : height );  
  8.     });  
  9.       
  10. });  
  11. –>  
  12. </script>  

另发现使用find("body")不太好使,高度不准确。