A-Frame 前端WebVR以及后端Flask服务器搭建(二)

前面说的只是如何在网页里放置资源,这部分,讲讲交互。总体来说,A-Frame集成了两种交互,第一第二都是基于没有VR设备的交互,分别是模拟鼠标点击交互。第三种就是基于VR手柄的交互。


##模拟鼠标光标
在给相机添加光标:

 <a-camera>
	  <a-cursor></a-cursor>
</a-camera>

可以看出,光标cursor是相机的子物体,相机移动时光标会保持在相机的正中心,默认这个光标是一个小的黑环,可以更改属性符合自己的审美。这个黑环就是我们在三维环境下模拟的鼠标,也是基于相机凝视的交互。

这个光标相当于相机正中发射一条射线,当它与第一个物体接触时发生你所定义的事件,比如改变一个正方体的颜色:

首先定义一个事件,change-color

<script>
        AFRAME.registerComponent('change-color', {
            init: function() {
                var el = this.el; // <a-box>
                el.addEventListener('mouseenter', function() {
                    el.setAttribute('color', '#24CAFF');
                });
                el.addEventListener('mouseleave', function() {
                    el.setAttribute('color', '#EF2D5E');
                })
            }
        });
    </script>

设置发生这个事件的物体:

<a-box color="#EF2D5E" position="0 0 -1" change-color></a-box>

当然你可以设置多个这样的物体,只要添加change-color事件即可。

光标还可以设置提醒,比如光标射到什么物体显示物体的名称。

<a-box src="#boxTexture" position="0 2 -5" rotation="0 45 45" scale="2 2 2"  event-set__enter="_event: mouseenter; _target: #cylinderText; visible: true"
                event-set__leave="_event: mouseleave; _target: #cylinderText; visible: false">
			<a-text id="cylinderText" value="this is a cube" align="center" color="#FFF" visible="false" position="1 1 -0.5"
              geometry="primitive: plane; width: 1.75" material="color: #333"></a-text>
		</a-box>

原理就是首先设置一个子物体显示提示文字,但默认不可见,当有射线时设置子物体可见即可。


##基于手柄的交互

我们需要在场景中定义手柄,在0.8.0版本中,给手柄添加了激光交互模块,定义如下:

   
    <a-entity laser-controls="hand: left" controller-cursor raycaster="showLine: true; far: 100" line="color: orange; opacity: 1">
</a-entity>
    <a-entity laser-controls="hand: right" controller-cursor raycaster="showLine: true; far: 100" line="color: orange; opacity: 1">
    </a-entity>
  

laser包含了激光和手柄在三维世界中显示的模型,controller-cursor定义了手柄交互按键的映射,将射线当作光标来使用,也就是说它和光标组件的作用一致,raycaster和line共同绘制了激光。

如果没有controller-cursor那么你就需要自定义所有的按键映射,比如 triggerdown, triggerup等。
比如:

<script>
        AFRAME.registerComponent('handle-events', {
            init: function() {
                var el = this.el; // <a-box>
                el.addEventListener('triggerdown', function() {
                    el.setAttribute('color', '#24CAFF');
                });
                el.addEventListener('triggerup', function() {
                    el.setAttribute('color', '#EF2D5E');
                })
            }
        });
    </script>

社区还有一个超级手模块,就是让手柄来模拟手,目前实现了
悬停(Hover): 在实体的碰撞空间中握住控制器
抓住(Grab): 按下一个按钮在实体上悬停或移动它
拉伸(Stretch): 用双手抓住一个实体并调整大小
拖放(Drag-drop): 将实体拖到另一实体上

这四个功能。不过相比前面的leap motion 来说,这个还是有点复杂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flask中实现前端实时显示后端处理进度可以通过使用WebSocket技术来实现。WebSocket是一种基于TCP的协议,可以实现双向通信,使得前后端能够在同一个连接上进行实时的数据交换。 首先,我们需要在Flask中使用WebSocket,可以使用Flask-SocketIO来方便地实现WebSocket功能。安装Flask-SocketIO后,我们可以在Flask应用中使用socketio对象来实现WebSocket的功能。 在后端代码中,我们可以通过在任务处理函数中发送进度信息给前端。例如,我们可以在任务处理函数的循环中,使用socketio的emit函数发送当前任务的进度信息。前端页面将通过监听WebSocket消息的方式接收进度信息。 在前端代码中,我们需要在页面中引入SocketIO的JavaScript库,并创建一个SocketIO对象。然后,我们可以使用socket.on()函数来监听后端发送的进度信息,并根据接收到的进度信息来更新前端页面上的进度显示。 需要注意的是,为了防止过多的WebSocket连接导致性能问题,我们可以考虑使用Flask-SocketIO提供的命名空间和房间功能。通过使用命名空间和房间,我们可以将客户端分组,只向特定的客户端发送进度信息。 总结起来,实现Flask前端实时显示后端处理进度的关键步骤是:在Flask应用中使用Flask-SocketIO实现WebSocket功能,后端任务处理函数中使用socketio对象发送进度信息,前端页面中使用SocketIO对象监听进度信息并更新页面显示。这样就能够实现前端实时显示后端处理进度的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值