制作高度计
高度计是通过对大气压强的测量来确定高度的。
目的
最终效果图
配置工作环境
创建一个名为”_altimeter”的工程,将GL Studio安装目录教程内的_altimeter教程下的testures文件夹拷贝到当前文件夹。
Object的设计
Step 1: 在创建的工程目录下,找到”_altimeter.gls”,并打开。后在”Geometry”选项卡窗口中删除默认生成的group。
Step 2: 打开”Application” tab, 为window title改名为”altimeter”, 然后设置窗口的初始尺寸为390x395。
Step 3: 在工具栏找到右侧的下拉箭头,在弹出的对话框中按下图内容进行设置:
创建背光板(Bezel)
背景遮光板由多边形object和其纹理组成。
Step 1: 选择工具栏中的工具;
Step 2: 绘制一个390x395的矩形;
Step 3: 为其重命名为”altimeter_panel”;
Step 4: 在”Object Properties” tab中,将”altimeter_panel”的Draw Mode设置为Filled;
Step 5: 同样在”Object Properties” tab中,点击Texture ->Texture Chooser上的 按钮,进入纹理选择对话框,将纹理添加进来,并选中”sltimeter.png”纹理;
\1. // Clamp the value of the odometer from 0 to 99999.
\2. _altitude = CLAMP_VALUE(value, 0.0f, 99999.9f);
\3. // Set the odometer readout to the actual incoming clamped value
\4. alt_digits->Value(_altitude);
\5. // Calculate the digits less than 1000 to set the needle position
\6. float alt_100 = (float)fmod(_altitude, 1000.0f)/100.0f;
\7. // Set the needle rotation using DynamicRotate, converting 100’s of feet to degrees.
\8. needle->DynamicRotate(-(alt_100 * (360/10)), Z_AXIS);
这段代码实现仪表表针绕Z轴的动态旋转,同时该值也会在显示在高度里程表上。
Step 3: 新建属性”float Barometer = 0.0f”,
Step 4: 为该属性的Set函数添加实现函数如下:
\1. _barometer = value;
\2. baro_digits->Value(_barometer);
本段代码将实现气压计表盘的显示。
Initialize
在geometry创建之后,Initialize()函数就开始执行了。
Step 1: 在”Code” tab中找到Initialize()函数,在代码输入框添加如下代码:
\1. Barometer(28.6f);
Calculate
Calculate()函数的调用发生在每帧的渲染之后。由于每帧循环都会调用该函数,故而切勿在函数体执行过多的内容。
Step 1: 找到Calculate()函数,在代码输入框中追加上下述代码:
\1. if (Testing())
\2. {
\3. // Generate ramping values from 0.0f to 12000.0f
\4. Altitude( RampFloat( time * .07, 0.0f, 12000.0f ) );
\5. }
本段代码使用效用函数RampFloat()在一个正弦波上值测试高度计的显示。
添加效用函数的头文件.
效用函数不包含在run-time库中,隐使用到了效用函数RampFloat(), 故需要添加对应的头文件”glsutil.h”。
Step 1: 在”Code” tab内选中”file _altimeterApp.h”, 在其代码输入框中输入以下内容:
\1. #include
Object的回调
GL Studio允许回调,回调一般发生在用户输入(鼠标,键盘,或其他),并且回调允许programmers定义与object相关的特定功能。
在该教程内需要定义两个回调函数,一个用于处理和气压读数相关的旋钮输入事件,另一个用于处理和ELEC/PNEU flag相关的开关。
Step 1: 首先先在”Geometry” tab中选中”baro_knob” object, 而后在”Code” tab中找到Object Callbacks->Selected Object Callbacks(#), 参考下图
点击代码输入框为所选择的object(这里是刚选中的baro_kbob)创建回调功能。
回调函数要求返回0或1,而这取决于该回调函数的event是否需要向上遍历该object的父节点的回调,更多information参考User’s Manual。
Step 2: 旋钮需要完成气压的读数显示功能,所以在回调函数中完成的正是此事。将下述代码添加到代码输入框:(Warning: 直接插入的话,会清除掉插入位置之后的内容)
\1. int handled = 0;
\2.
\3. if (ObjectEventIs(ev,“PositionVal”))
\4. {
\5. // If the knob is turned, we change the value
[外链图片转存中…(img-tjNZjQJY-1615698474939)]
点击代码输入框为所选择的object(这里是刚选中的baro_kbob)创建回调功能。
回调函数要求返回0或1,而这取决于该回调函数的event是否需要向上遍历该object的父节点的回调,更多information参考User’s Manual。
Step 2: 旋钮需要完成气压的读数显示功能,所以在回调函数中完成的正是此事。将下述代码添加到代码输入框:(Warning: 直接插入的话,会清除掉插入位置之后的内容)
\1. int handled = 0;
\2.
\3. if (ObjectEventIs(ev,“PositionVal”))
\4. {
\5. // If the knob is turned, we change the value
// of the Baro