一点小疑问

记得我第一次看Nehe教程里第9课的时候,就被他下面这段代码弄晕了:
None.gifglRotatef(tilt,1.0f,0.0f,0.0f);//TiltTheView(UsingTheValueIn'tilt')
None.gif
glRotatef(star[loop].angle,0.0f,1.0f,0.0f);//RotateToTheCurrentStarsAngle
None.gif
glTranslatef(star[loop].dist,0.0f,0.0f);//MoveForwardOnTheXPlane
None.gif
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);//CancelTheCurrentStarsAngle
None.gif
glRotatef(-tilt,1.0f,0.0f,0.0f);//CancelTheScreenTilt
None.gif

他给出的解释更是让我摸不着头脑:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

现在我们来移动星星。星星开始时位于屏幕的中心。我们要做的第一件事是把场景沿Y轴旋转。如果我们旋转90度的话,X轴不再是自左至右的了,他将由里向外穿出屏幕。为了让大家更清楚些,举个例子。假想您站在房子中间。再设想您左侧的墙上写着-x,前面的墙上写着-z,右面墙上就是+x咯,您身后的墙上则是+ z。加入整个房子向右转90度,但您没有动,那么前面的墙上将是-x而不再是-z了。所有其他的墙也都跟着移动。-z出现在右侧,+z出现在左侧,+x出现在您背后。神经错乱了吧?通过旋转场景,我们改变了xz平面的方向。
第二行代码沿x轴移动一个正值。通常x轴上的正值代表移向了屏幕的右侧(也就是通常的x轴的正向),但这里由于我们绕y轴旋转了坐标系,x轴的正向可以是任意方向。如果我们转180度的话,屏幕的左右侧就镜像反向了。因此,当我们沿 x轴正向移动时,可能向左,向右,向前或向后。

接着的代码带点小技巧。星星实际上是一个平面的纹理。现在您在屏幕中心画了个平面的四边形然后贴上纹理,这看起来很不错。一切都如您所想的那样。但是当您当您沿着y轴转上个90度的话,纹理在屏幕上就只剩右侧和左侧的两条边朝着您。看起来就是一条细线。这不是我们所想要的。我们希望星星永远正面朝着我们,而不管屏幕如何旋转或倾斜。
我们通过在绘制星星之前,抵消对星星所作的任何旋转来实现这个愿望。您可以采用逆序来抵消旋转。当我们倾斜屏幕时,我们实际上以当前角度旋转了星星。通过逆序,我们又以当前角度"反旋转"星星。也就是以当前角度的负值来旋转星星。就是说,如果我们将星星旋转了10度的话,又将其旋转-10度来使星星在那个轴上重新面对屏幕。下面的第一行抵消了沿y轴的旋转。然后,我们还需要抵消掉沿x轴的屏幕倾斜。要做到这一点,我们只需要将屏幕再旋转-tilt倾角。在抵消掉xy轴的旋转后,星星又完全面对着我们了。

今天又复习到这一课了,还是理解不了他干嘛要旋转坐标轴,接着又逆向旋转回去,就和susu讨论了下:

None.gifphinecos15:53:12
None.gif我感觉他是多余了,我修改了下代码
None.gifphinecos
15:53:22
None.gif效果也差不多呀
None.gifsusu
15:53:31
None.gif是不是仅在距离上有点变化
None.gifphinecos
15:53:38
None.gif
//glRotatef(tilt,1.0f,0.0f,0.0f);//TiltTheView(UsingTheValueIn'tilt')
None.gif
glRotatef(star[loop].angle,0.0f,0.0f,1.0f);//RotateToTheCurrentStarsAngle
None.gif

None.gifglTranslatef(star[loop].dist,
0.0f,0.0f);//MoveForwardOnTheXPlane
None.gif
None.gif
//glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);//CancelTheCurrentStarsAngle
None.gif
//glRotatef(-tilt,1.0f,0.0f,0.0f);//CancelTheScreenTilt
None.gif
susu15:53:49
None.gif我看他唯一没有抵消的快乐能是dist了
None.gifphinecos
15:54:17
None.gif没必要抵消嘛,他把坐标轴转了个90度,我认为没必要
None.gifsusu
15:54:31
None.gif是啊,转来转去的
None.gifphinecos
15:54:41
None.gifglRotatef(star[loop].angle,
0.0f,0.0f,1.0f);
None.gifglTranslatef(star[loop].dist,
0.0f,0.0f);
None.gifphinecos
15:55:05
None.gif我就这两句,让星星围着z轴转个角度,再平移个距离
None.gifsusu
15:55:32
None.gif那又没有那个四边形没有正对着照相机?
None.gifphinecos
15:56:05
None.gif好像没有呀
None.gifphinecos
15:56:21
None.gif我再比对下效果看看
None.gifsusu
15:56:27
None.gif对,前面坐标轴没有动
None.gifphinecos
15:56:44
None.gif哪个坐标轴没动呢?
None.gifsusu
15:57:01
None.gif
//glRotatef(tilt,1.0f,0.0f,0.0f);
None.gif
phinecos15:57:38
None.gif这个坐标轴转个90度到底有啥用处吗?让四边形对着视点?
None.gifphinecos
15:58:02
None.gif它这是绕x轴转90度,我想不通
None.gifsusu
15:58:11
None.gif对阿
None.gifphinecos
15:59:10
None.gif绕x轴转90度,那y,z轴就互换了,对吗?
None.gifsusu
15:59:26
None.gif
None.gifphinecos
15:59:34
None.gif这里转90度,是坐标轴转,还是物体转呢?
None.gifphinecos
15:59:42
None.gif我认为是坐标轴呢
None.gifsusu
15:59:46
None.gif坐标轴吧
None.gifphinecos
16:00:31
None.gif那y,z轴既然已经换了,那这句:glRotatef(star[loop].angle,
0.0f,1.0f,0.0f);//旋转至当前所画星星的角度;到底是围着哪条轴转的?
None.gif
phinecos16:01:02
None.gif本来应该是绕y轴,可现在z轴在它的位置上,不是变绕z了?
None.gifsusu
16:01:09
None.gif应该是
None.gifphinecos
16:02:06
None.gifglTranslatef(star[loop].dist,
0.0f,0.0f);//沿X轴正向移动,这里又绕x轴平移,本来x轴就没动过,所以前面做的坐标轴变换不是白搭了。。。
None.gif
phinecos16:02:37
None.gif我试下两种代码的效果区别先
None.gifsusu
16:02:45
None.gif是啊
None.gifphinecos
16:05:42
None.gif汗,我是看不出效果的区别。。。
None.gifsusu
16:06:00
None.gif呵呵
None.gifsusu
16:06:14
None.gifglTranslatef(star[loop].dist,
0.0f,0.0f);是不是只做了一遍
None.gifphinecos
16:06:28
None.gif恩,是的
None.gifsusu
16:06:43
None.gif它应该是使星星分散开的
None.gifsusu
16:06:58
None.gif想明白就可以了,呵呵
None.gifphinecos
16:07:08
None.gif哦,那下面还有的:star[loop].dist
-=0.01f;
None.gif
if(star[loop].dist<0.0f)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifstar[loop].dist
+=5.0f;
InBlock.gifstar[loop].r
=rand()%256;
InBlock.gifstar[loop].g
=rand()%256;
InBlock.gifstar[loop].b
=rand()%256;
ExpandedBlockEnd.gif}

None.gifphinecos
16:07:23
None.gif先让它归中,然后抛出去
None.gifsusu
16:07:34
None.gif形成动画
None.gifphinecos
16:08:01
None.gif恩,我修改后的代码和Nehe的效果没什么区别,但没有刚才那么难理解了
None.gifphinecos
16:08:15
None.gif刚才它旋转来,又旋转回去,晕掉了
None.gifsusu
16:08:16
None.gif呵呵,他可能当时有点晕了
None.gif

我觉得他先把坐标轴绕X轴转了个90度,这不就让y,z轴互换了吗?再让四边形绕y轴(我理解这里应该是旋转后的z轴了)转自己的角度,最后平移自己到中心的距离,可最终他又反向旋转回去,真是让人晕,那这样旋转坐标轴到底有什么用处呢?不转还不是一样,我下面就修改了他的代码,根本不去转那个该死的坐标轴,好像最终效果也差不多呀:

None.gifglRotatef(star[loop].angle,0.0f,0.0f,1.0f);//RotateToTheCurrentStarsAngle
None.gif
glTranslatef(star[loop].dist,0.0f,0.0f);//MoveForwardOnTheXPlane
None.gif

我就让星星绕Z轴转自己的角度,再绕X轴平移自己距中心的距离,这样有什么问题呢?至少我是想不通。。。

<think>嗯,用户遇到了在构建carla-ros-bridge项目时出现的编译错误,特别是pcl_recorder和rviz_carla_plugin的构建失败。首先,我需要分析错误信息。用户提到pcl_recorder的错误是找不到tf2_eigen/tf2_eigen.h文件,这通常是因为缺少对应的依赖或者头文件路径没有被正确包含。根据用户提供的引用[1]和[2],解决方法是在CMakeLists.txt中添加tf2_eigen依赖。 接下来,我应该检查pcl_recorder的CMakeLists.txt文件。用户提到在ament_target_dependencies中添加tf2_eigen,这可能是关键步骤。需要确保这个依赖项被正确添加到相关的target中,比如pcl_recorder_node。同时,可能还需要确认find_package是否包含了tf2_eigen,如果未包含,需要添加进去。 然后,rviz_carla_plugin的构建失败可能涉及不同的问题。常见的可能性包括缺少依赖项或者插件lib的问题。用户可能需要检查该插件的CMakeLists.txt,确认是否添加了必要的依赖,如rviz_common、rviz_rendering等。此外,安装路径的设置是否正确,比如使用ament_export_plugins来导出插件,确保安装后的路径可以被正确找到。 另外,用户可能没有正确安装所有ROS 2的依赖包,比如tf2_eigen本身可能需要通过sudo apt-get安装。需要提醒用户安装ros-<distro>-tf2-eigen,其中distro是他们的ROS 2版本,如humble或foxy。 在步骤指导方面,需要分步骤说明如何修改CMakeLists.txt文件,添加依赖项,并重新编译。同时,处理rviz_carla_plugin的问题可能需要类似的步骤,比如添加依赖和确保插件安装正确。最后,用户如果还有问题,应该检查环境变量和安装路径,或者查看更详细的编译日志。 需要确保回答结构清晰,步骤详细,用户能够一步步跟随操作。同时,生成的相关问题应该覆盖常见的后续疑问,如验证安装、处理其他依赖问题,以及如何调试编译错误。</think>### 针对Carla-ROS-Bridge编译错误的修复指南 #### **步骤1:修复pcl_recorder的tf2_eigen依赖问题** 1. **定位CMakeLists.txt文件** 找到`pcl_recorder`模块的编译配置文件: ```bash /home/xxx/carla-ros-bridge/src/ros-bridge/pcl_recorder/CMakeLists.txt ``` 2. **修改依赖项配置** 在`ament_target_dependencies`语句中添加`tf2_eigen`,例如: ```cmake ament_target_dependencies(pcl_recorder_node rclcpp pcl_conversions tf2_ros tf2_eigen # 新增此行 ) ``` 此操作确保编译器能正确链接到`tf2_eigen`头文件[^1][^2]。 3. **验证依赖包安装** 检查系统中是否已安装ROS 2的`tf2_eigen`包: ```bash sudo apt-get install ros-<distro>-tf2-eigen # 替换<distro>为实际ROS版本(如humble/foxy) ``` --- #### **步骤2:处理rviz_carla_plugin构建中断问题** 1. **检查插件依赖项** 打开`rviz_carla_plugin`的CMakeLists.txt,确保包含以下依赖: ```cmake find_package(ament_cmake REQUIRED) find_package(rviz_common REQUIRED) find_package(rviz_rendering REQUIRED) find_package(tf2_ros REQUIRED) find_package(tf2_eigen REQUIRED) # 新增 ``` 2. **修正插件安装路径** 在CMakeLists.txt末尾添加插件安装指令: ```cmake install( TARGETS rviz_carla_plugin LIBRARY DESTINATION lib/${PROJECT_NAME} ) ament_export_plugins(rviz_carla_plugin) ``` --- #### **步骤3:重新编译项目** 1. **清理旧编译缓存** ```bash rm -rf build install log ``` 2. **执行全工作区编译** ```bash colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release ``` 3. **验证编译结果** 检查输出日志中是否仍报错,若成功应显示: ```bash Summary: X packages finished [XX seconds] ``` --- #### **常见问题补充** - **依赖版本冲突**:若使用ROS 2 Humble,需确认`carla-ros-bridge`分支与其兼容。 - **头文件路径问题**:手动指定`Eigen3`路径(需安装`libeigen3-dev`): ```cmake find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIRS}) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值