首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何始终基于我的轴方向移动我的对象?

在软件开发中,特别是在游戏开发和图形处理中,经常需要根据特定的轴方向移动对象。以下是一些基础概念和相关信息,帮助你理解如何实现这一功能。

基础概念

  1. 坐标系:在二维或三维空间中,对象的位置通常由坐标表示。常见的坐标系有笛卡尔坐标系(直角坐标系)和极坐标系。
  2. 轴方向:在笛卡尔坐标系中,轴方向通常指X轴、Y轴和Z轴。X轴表示水平方向,Y轴表示垂直方向,Z轴表示深度方向(在三维空间中)。
  3. 向量:向量用于表示方向和大小。在移动对象时,可以使用向量来指定移动的方向和距离。

实现方法

以下是一些常见的方法来实现基于轴方向的移动:

1. 使用向量加法

假设你有一个对象的位置向量 position 和一个移动向量 moveVector,你可以通过向量加法来更新对象的位置。

代码语言:txt
复制
# 示例代码(Python)
position = [0, 0]  # 初始位置
moveVector = [5, 0]  # 向右移动5个单位

# 更新位置
position[0] += moveVector[0]
position[1] += moveVector[1]

print(position)  # 输出: [5, 0]

2. 使用方向角度

如果你有一个方向角度 theta 和移动距离 distance,可以通过三角函数计算新的位置。

代码语言:txt
复制
import math

# 示例代码(Python)
position = [0, 0]  # 初始位置
theta = math.pi / 4  # 45度
distance = 5  # 移动距离

# 计算新的位置
new_x = position[0] + distance * math.cos(theta)
new_y = position[1] + distance * math.sin(theta)

position = [new_x, new_y]
print(position)  # 输出: [3.5355339059327378, 3.5355339059327373]

3. 使用游戏引擎提供的功能

如果你使用的是游戏引擎(如Unity、Unreal Engine),这些引擎通常提供了内置的功能来处理对象的移动。

代码语言:txt
复制
// 示例代码(Unity C#)
transform.position += new Vector3(5, 0, 0);  // 向右移动5个单位

应用场景

  • 游戏开发:在游戏中,角色、敌人和其他对象的移动通常基于轴方向。
  • 图形处理:在图形应用程序中,可能需要根据特定的轴方向移动图形元素。
  • 机器人控制:在机器人控制系统中,可能需要根据轴方向移动机器人的各个部分。

可能遇到的问题及解决方法

  1. 移动不准确
    • 原因:可能是由于浮点数精度问题或计算错误。
    • 解决方法:使用更高精度的数学库或检查计算逻辑。
  • 移动速度不一致
    • 原因:可能是由于帧率变化导致的移动距离不一致。
    • 解决方法:使用固定的时间步长来更新位置,或者使用速度乘以时间来计算移动距离。
代码语言:txt
复制
# 示例代码(Python)
import time

position = [0, 0]
speed = 5  # 单位:像素/秒

while True:
    start_time = time.time()
    # 更新位置
    position[0] += speed * (time.time() - start_time)
    # 其他逻辑...

通过以上方法,你可以有效地基于轴方向移动对象,并解决可能遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

我是如何从Web开发转向移动开发的?

我是如何从Web开发转向移动开发的? 我的职业开发生涯是作为一个Web开发人员开始的,使用的是PHP。不久后,我切换到.NET生态系统,使用C#和ASP .NET MVC框架来继续搞web开发。...因为我想要做一些新的东西以学习新的技能,虽然在web编程上我仍然有很多需要学习的地方。 我认为,移动app有一个前途光明的未来,虽然已经有很多app存在于网上的商店里。...但是,新的移动设备来了,如智能手表,它们是开发人员崭新的机遇。这是一个学习如何为移动设备创建应用程序的很好契机。...我需要处理两个我完全不曾涉足的生态系统(Android和iOS),两个我一无所知的框架(Xamarin和MvvmCross)和一些并不容易满足的业务需求。不过,幸运的是,至少我知道如何使用C#。...,“如何为客户提供最好的体验?”

1.3K60

游戏开发中的矩阵与变换

但是,您可以将矩阵的行视为显示哪些向量有助于沿给定方向移动。 当我们引用诸如txy的值时,这就是X列向量的Y分量。换句话说,矩阵的左下角。...这与我们对图像右上角的位置的观察相符。 希望您现在完全理解了变换矩阵如何影响对象,以及基矢量之间的关系以及对象的“ UV”或“坐标内”如何改变其世界位置。...相对于自身移动对象 一种常见的操作(尤其是在3D游戏中)是相对于自身移动对象。例如,在第一人称射击游戏中,您希望当按时角色向前移动(-Z轴)W。...由于基本向量是相对于父对象的方向,而原点向量是相对于父对象的位置,因此我们可以简单地添加多个基本向量来相对于自身移动对象。...v=rHLEWRxRGiM 表示3D旋转(高级) 2D和3D转换矩阵之间的最大区别在于,如何在没有基向量的情况下自己表示旋转。 使用2D,我们有一个简单的方法(atan2)在转换矩阵和角度之间切换。

1.6K20
  • 如何将没有复制或移动构造函数的对象放入vector容器

    原因是因为std::vector容器的插入一定会调用类对象的构造函数或者移动构造函数。...说一下为什么会有这个问题,因为不想用指针,我想直接通过类对象本身的RAII机制来实现的资源的控制,智能指针是一个解决方案,不过智能指针是写起来很繁琐,终究比不上值类型方便。...不过值类型要用好还是很麻烦的,比如这里的将没有复制或移动构造函数的对象插入到std::vector容器中的问题。 经过查阅资料,总共有四种解决方案: 使用默认构造函数,并且初始化时确定容器大小。...使用智能指针的方案还是不错的,只要你愿意使用智能指针的语法。笔者这里使用的时第三种,更换容器为std::deque。...因此,在插入时std::deque不像std::vector那样需要移动或者拷贝构造,是直接初始化构造在分配的空间中的。

    19350

    第4章-变换-4.2-特殊矩阵变换和运算

    重要的是要注意,欧拉角的一些表示将z轴作为初始向上方向。这种差异纯粹是一种符号变化,尽管可能会令人困惑。在计算机图形学中,在如何看待世界以及如何形成内容方面存在分歧:y-up或z-up。...与媒体相关的建模系统通常将y方向视为世界坐标中的向上,这与我们在计算机图形中始终描述相机屏幕向上方向的方式相匹配。...例如,一组和另一组之间的插值并不是对每个角度进行插值的简单问题。事实上,两组不同的欧拉角可以给出相同的方向,因此任何插值都不应该旋转对象。...要将螺栓固定到位,您必须围绕x轴旋转扳手。现在假设您的输入设备(鼠标、VR手套、太空球等)为你提供了一个旋转矩阵,即用于扳手移动的旋转。问题是将这个变换应用到扳手可能是错误的,它应该只围绕x轴旋转。...然后我们将此基与标准基对齐,以便 与x轴对齐。在这个标准基中进行绕x轴的旋转,最后我们变换回原来的坐标基。 为了计算 ,我们需要找到两个与 和彼此正交的轴。

    3.5K40

    基础渲染系列(一)图形学的基石——矩阵

    我将使用默认的立方体作为预制对象,将其缩放为一半大小,以便在它们之间留出空间。 ? (缩小立方体预置) 创建一个网格对象,添加我们的组件,并连接预制件。...这让我们可以移动“点”,而无需移动实际的网格对象。我们所有的转换都发生在对象的局部空间中。 ? ? (变换位置) 2.2 缩放 接下来是缩放转换。...我们从一个新组件开始,该组件将返回没有变化的点。 ? 那么旋转该如何实现呢? 它需要限制自己绕单个轴(Z轴)旋转。 围绕该轴旋转点就像旋转一个轮子。...Unity的实际轮换顺序为ZXY。 现在我们有了这个矩阵,可以看到如何构建旋转结果的X,Y和Z轴。 ? ?...这是基本的正交摄影机投影。 我们的原始相机位于原点,并朝正Z方向看。 那我们可以移动它并旋转它吗? 是的,事实上我们已经可以做到了这一点。 移动相机与向相反方向移动世界具有相同的视觉效果。

    5K23

    ARKit和CoreLocation:第一部分

    这篇文章和下一篇文章是关于我使用ARKit和CoreLocation进行实验的两部分系列!第一部分将介绍ARKit的基础知识,从MapKit获取方向以及触摸矩阵变换的基础知识。...定义 视觉惯性测距(VIO):ARKit分析手机摄像头和运动数据,以便跟踪周围的世界。计算机视觉记录了环境中的显着特征,无论iPhone的移动如何,都能够保持对现实世界中位置的了解。...**重力:**通过将对齐设置为**重力,** ARKit将y轴与重力平行对齐,z轴和x轴沿着设备的原始方向定向 ?...image.png worldAlignment.gravity - Apple Docs 首次运行会​​话配置时设备的位置和方向决定了坐标系的其余部分:对于z轴,ARKit选择(0,0,-1)指向设备摄像机面向和垂直于重力轴的方向的基矢量...ARKit使用右手规则选择基于z轴和y轴的x轴 - 也就是说,基矢量(1,0,0)与其他两个轴正交,并且(对于在负z方向上看的观察者)指向正确的。 ?

    2.3K20

    iOS ARKit教程:用裸露的手指在空中画画

    平面在X和Z方向上定义,其中Y是表面的法线,即,如果我们想让它看起来好像在平面上打印,我们应该始终将我们的绘图节点位置保持在平面的相同Y值内。 。 平面检测通过ARKit提供的回调函数完成。...我们使用它来添加我们自己的平面节点,该节点也是不可见的,但保存有关平面方向和位置的信息anchor。 那么如何保存位置和方向 ARPlaneAnchor?位置,方向和比例均以4x4矩阵编码。...checkIfObjectShouldMoveOntoPlane 检查我们是否已经绘制了对象并检查所有这些对象的y轴是否与新检测到的平面的y轴相匹配。...以下代码显示了PointNode表示点的类: 您将在上面的代码中注意到我们将几何体沿y轴平移了一半的高度。这样做的原因是为了确保对象的底部始终位于y = 0,以便它出现在平面上方。...对象跟踪的工作原理如下:首先,我们为它们提供一个图像和一个正方形的坐标,用于我们想要跟踪的对象的图像边界。之后我们调用一些函数来初始化跟踪。

    2.2K30

    进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

    (Triplanar贴图材质,使用法线作为反照率) 2 三面纹理化 当顶点UV坐标不可用时,我们如何执行纹理映射?唯一可行的方法是将世界位置(或许是对象空间位置)用作纹理映射的UV坐标的替代来源。...但这不是唯一可能的方向。我们也可以使用XZ坐标沿Y轴投影。这对应于通常用于对地形进行纹理化的平面纹理映射。 ? ? (使用XZ位置当做UV坐标) 第三种选择是使用YZ坐标沿X投影。 ? ?...为了保持预期的方向,我们必须改用ZY。 ? ? (将位置ZY用于UV坐标) 2.2 组合所有的三个映射 当表面与投影轴基本对齐时,单平面映射效果很好,否则的话,看起来很糟糕。...在垂直方向上,你可以看到重复的44和45。 ? (对齐贴图) 可以通过抵消投影来消除这种重复。如果我们将X映射垂直移动½,则在X和Z之间消除它们。对于Y和Z,如果我们将X水平移动½,同样。...然后从中删除所有已属于其基类的代码。与其在OnGUI中自行设置变量,不如通过调用base.OnGUI将其委托给其基类的OnGUI方法。 ?

    2.5K30

    Three.js基础之变换3D对象 | 《Three.js零基础直通04》

    在三维空间中,要确切的知道一个3D对象的轴向并不简单,尤其当我们旋转移动过相机之后。...AxesHelper 将始终显示与x,y和z轴相对应的3个轴向指示,每一个轴向的指示都从场景的中心开始并沿相应的方向延伸。 创建AxesHelper,并将其添加到场景中。...让我们逐个改变三个轴向的旋转角度,然后对照轴辅助工具来观察旋转是如何生效的。 “关于旋转角度,你会使用π吗?”...但是这里面有个坑,当我们同时旋转多个轴时可能会得到一些意想不到的结果。因为,当你旋转x轴时,也会改变其他轴的方向。因而我们可以通过使用reorder(...) 方法对象来更改旋转轴的应用顺序。...3D对象了,下一小节我们将学习如何创建动画。

    3.5K20

    自己动手写游戏:Flappy Bird

    ,图像上主要是采用了GDI+,游戏对象的创建控制上使用了单例模式,现在我就来简单地总结一下。...(2)这款游戏的对象只有俩:一个小鸟(有三种挥动翅膀的状态)以及一对管道(有管道向上和向下两个方向);     小鸟:① ? ② ? ③ ?     管道: ?...(3)对象的运动   在整个游戏中,小鸟会受重力默认向下坠落,而用户可以根据点击或按键盘Space键使小鸟向上飞,从图像呈现上其本质就是更改游戏对象在Y轴的位置,使其从下往上移动;而管道则会从屏幕右侧出现...可以看到,从图像呈现上期本质就是更改管道对象在X轴的位置,使其从右往左移动。 ? (4)设计流程图   在整个开发设计过程中,我们可以根据优先级设计开发流程,根据流程一步一步地实现整个游戏。 ?...在游戏界面中,任何一个游戏对象我们都可以视为一个矩形区域(Rectangle类实例),它的坐标是X轴和Y轴,它还有长度和宽度,可以轻松地确定一个它所在的矩形区域。

    98320

    操纵杆控制-使用控制器移动玩家

    在本节中,我们将播放器连接到操纵杆,这样我们就可以用旋钮移动它。我们还将了解触摸,将旋钮重置为其初始状态以及如何控制播放器的位置,以便他始终在X轴上朝向正确的方向。...在X轴上移动我们的玩家 由于我们的旋钮正常工作并连接到我们的播放器,因此下一步,我们需要让我们的播放器在其X轴上移动。所以,让我们在Measure变量之后创建一些新变量。...如果您运行模拟器,您将看到我们现在可以使用操纵杆控制我们的玩家在X轴上的移动。但是,我们需要根据其方向翻转我们的播放器图像。 水平翻转我们的播放器 要控制我们玩家的水平翻转,我们需要设置其X位置。...run(移动)并在同一行代码上开始设置。 结论 让我们运行模拟器,您会注意到现在您可以从左到右控制我们的播放器,图像根据其方向水平翻转。恭喜!...所以在本节中,我们学到了很多东西,比如触摸功能,如何移动旋钮,如何重置旋钮的初始位置,我们让玩家在X轴上移动,我们也根据X轴方向水平翻转。

    1.3K10

    【笔记】《计算机图形学》(6)——变换矩阵

    轴缩放的倍率 缩放是基于坐标轴缩放的,所以如果需要朝着某个方向进行缩放的话需要旋转到轴上,缩放,再旋转回去 ?...错切: 错切变换形象地说类似于把一堆扑克牌推斜,也就是在高和底边都不改变的情况下,将整个图形往轴向方向拉 错切矩阵是上/下三角矩阵,参数s指的是将那个轴的顶部元素推动的比率距离 ?...这个巧妙的写法使得我们可以很简单地处理实际的需要进行移动的向量和仅仅用来指示方向,不希望发生移动的向量 而在程序的编写时,这个特殊的值通常用一个标记位额外记忆,然后矩阵变换为仿射矩阵是计算前才合成出来的...这样就引出了坐标系变换的问题,前面我们讨论的都是如何在不动的坐标系中移动目标点,而如何得到物体在新的坐标系中的坐标这个问题就是坐标系变换,之前在2.4中稍微提到过一点点。...那么假如我们现在有一个在uev坐标系中的点,如何得到其在xoy坐标系中的坐标呢,其实这本质上还是仿射变换的思路,首先我们需要得到当前坐标系uev的基向量和原点在xoy坐标系中的坐标,然后由于我们当前目标点的坐标是在

    3.1K20

    第4章-变换-4.1-基础变换

    左边的正方形用平移矩阵 进行变换,由此正方形向右移动5个距离单位,向上移动2个距离单位。 在这一点上我们应该提到,有时在计算机图形中看到的另一种有效的符号方案:使用底行具有平移向量的矩阵。...方向矩阵是与相机视图或对象相关联的旋转矩阵,它定义了它在空间中的方向,即它的向上和向前的方向。 在二维中,旋转矩阵很容易推导。假设我们有一个向量 ,我们将其参数化为 。...这也适用于任意数量的这些变换的级联。旋转矩阵还有另一种求逆的方法: ,即绕同一轴向相反方向旋转。 示例:围绕一个点旋转。假设我们要围绕z轴将对象旋转 弧度,旋转中心是某个点 。...4.1.3 缩放 缩放矩阵 分别沿x、y和z方向使用因子 、 和 缩放实体。这意味着缩放矩阵可用于放大或缩小对象。其中的 越大,缩放的实体在该方向上就越大。...首先构造矩阵 ,改变基,如下所示: image.png 思路是让三个轴给定的坐标系与标准轴重合,然后使用标准缩放矩阵,再变换回来。第一步是乘以转置,即 的逆。

    4K110

    第98天:CSS3中transform变换详解

    下面我们一起来看看CSS3中transform的旋转rotate、扭曲skew、缩放scale和移动translate具体如何实现,老样子,我们就从transform的语法开始吧。...二、移动translate 移动translate我们分为三种情况:translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动);translateX(x)仅水平方向移动(X轴移动...也就是translate(x,y),它表示对象进行平移,按照设定的x,y参数值,当值为负数时,反方向移动物体,其基点默认为元素 中心点,也可以根据transform-origin进行改变基点。...scale(X,Y)是用于对元素进行缩放,可以通过transform-origin对元素的基点进行设置,同样基点在元素中心位置;基中X表示水平方向缩放的倍数,Y表示垂直方向的缩放倍数,而Y是一个可选参数...就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素,此属性值使用涉及到数学中的矩阵,我在这里只是简单的说一下CSS3中的transform有这么一个属性值,如果有感兴趣的朋友可以去了解更深层次的martix

    1K30

    Unity Hololens2开发|(十一)MRTK3 Solver(求解器)

    以下求解器提供基本行为的构建基块: 求解器类型 描述 Orbital 锁定到指定位置并偏离参照对象 ConstantViewSize 应缩放以保持相对于参照对象视图不变的大小 RadialVie 使对象保持在参照对象的视锥投射范围内...Momentum 应用加速/速度/摩擦来模拟由其他求解器/组件移动的对象的动量和弹性。 HandConstraint 约束对象,使其在 GameObject 不会与手部交叉的区域跟随手部。...此求解器只能与 XRNode 控制器一起使用,如果与其他控制器类型一起使用,此求解器的行为类似于基类。 Overlap 与跟踪的对象重叠。...“Orientation Type(方向类型)”属性确定应用于对象的旋转,例如,对象应始终保持原始旋转,或者总是面向摄像头,或者面向驱动其位置的转换。...“Min和Max View Degrees”属性决定了 GameObject 必须始终在视线范围内的部分的面积。

    34710

    Unity基础教程-物体运动(七)——移动地面(Going for a Ride)

    (插值平台运动) 1.3 侧面移动 解决了垂直运动,我们还需要支持向其他方向运动的平台。因此,我用自己的动画剪辑和控制器制作了另一个平台,该动画剪辑和控制器沿X轴左右移动。 ?...2.3 检测移动 如果连接的主体是自由移动的物理对象,那么它将具有速度,但是在运动动画对象的情况下,其速度将始终为零。因此,我们必须通过跟踪其位置来自己推断出连接速度。...下一个问题是我们如何将其纳入球体的运动中。实际上,当你从正在移动的物体移到静止的物体(反之亦然)时,需要补偿相对运动的突然变化。这很费力,如果变化很大,可能会很困难。如果太大,最终会掉下去。...(在旋转的平台上行走) 现在,我们的球体会加速以跟上旋转,但请注意,它不会调整其方向来匹配。由于我们的球体永不旋转,它会自动重新定向以保持朝相同的方向看。 另请注意,旋转可能会是高速旋转。...2.6 复杂的动画 因为我们的方法不在乎表面如何移动,所以我们的效果不会局限于简单的动画。

    2.2K20

    Unity Demo教程系列——Unity塔防游戏(四)弹道(Lobbing Explosives)

    将炮塔重命名为mortar,将其向下移动,使其位于基座顶部,使其略带灰色,然后将其连接起来。同样,在这种情况下,我们可以使用单独的对象来保持迫击炮的碰撞体固定,而仅将碰撞体叠加在迫击炮塔的默认方向上。...为了简单,我们将始终瞄准地面,因此一旦炮弹的高度降低到零,它们就会爆炸。 2.1 水平瞄准 要让炮塔瞄准,你首选要将其水平指向目标,然后调整其垂直方向,使炮弹以正确的距离着陆。...我们从第一步开始,首先使用固定的相对点而不是移动目标,以轻松验证我们的计算是否正确。 将一个GameUpdate方法添加到MortarTower中,该方法始终调用Launch方法。...(对目标进行火力封阻) 3 炮弹 计算轨迹的关键在于我们现在知道了如何发射炮弹。下一步是创建并启动它们。 3.1 战争工厂 我们需要一个工厂来创建炮弹对象的实例。...我们始终相对于其发射点执行此操作,因此无论更新频率如何,它都能完美地遵循其轨迹。 ? ? (发射炮弹) 为了同时使炮弹与它们的轨迹对齐,我们必须使它们沿着导数向量方向,这就是当时的速度。 ? ?

    2.4K10

    3D图形学线代基础

    简单来说向量是既有大小又有方向的线段,从 B 点移动到 A 点的方向也就是图中箭头所示的方向即为向量 BA 的方向,线段 BA 的长度即为向量 BA 的大小。...从 B 点移动到 A 点,在 X 轴上位置的变化为 x1-x2,在 Y 轴上位置的变化为 y1-y2,把这两个维度上的位置的变化组合在一起最终形成了二维向量 BA;图中 BA 上方的箭头表示向量的方向是从...OA 向量表示在 X 轴正方向上移动 1 个单位和在 Y 轴正方向上移动 2 个单位,而 OB 向量表示在 X 轴正方向上移动 2 个单位和 Y 轴正方向上移动 1 个单位,那么它们的结果向量就是对它们在...X 和 Y 轴上的位移的累加,也就是说结果向量 AC 表示在 X 轴正方向上移动 3 个单位且在 Y 轴正方向上也移动 3 个单位。...X 轴基向量变换后的新向量为 OC,Y 轴基向量变换后的新向量为 OD,而 OC 向量和 OD 向量组成的平行四边形的有符号面积即为矩阵 A 的大小也就是矩阵 A 的行列式。

    2.1K31

    【基础系列】CSS专题

    (也就是X轴和Y轴同时移动);translateX(x)仅水平方向移动(X轴移动);translateY(Y)仅垂直方向移动(Y轴移动),具体使用方法如下:         1、translate([,...也就是translate(x,y),它表示对象进行平移,按照设定的x,y参数值,当值为负数时,反方向移动物体,其基点默认为元素 中心点,也可以根据transform-origin进行改变基点。...(也就是X轴和Y轴同时缩放);scaleX(x)元素仅水平方向缩放(X轴缩放);scaleY(y)元素仅垂直方向缩放(Y轴缩放),但它们具有相同的缩放中心点和基数,其中心点就是元素的中心位置,缩放基数为...scale(X,Y)是用于对元素进行缩放,可以通过transform-origin对元素的基点进行设置,同样基点在元素中心位置;基中X表示水平方向缩放的倍数,Y表示垂直方向的缩放倍数,而Y是一个可选参数...,前面我也说过了,说简单一点就是类似于我们的background-position的用法,但又有其不一样,因为我们background-position不需要区别浏览器内核不同的写法,但transform-origin

    26220

    unity3d之核心类介绍

    image.png Object 所有Unity3D的基类。 持有实例的ID信息。 Component (组件) 所有的Component,都会指向其所属的GameObject。...Transform(转换) 主要用于控制物体的旋转、移动、缩放。...eulerAngles 世界坐标系中的旋转(欧拉角)。 localEulerAngles 相对于父级的变换旋转角度。 right 世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)...up 世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。) forward 世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)...root 对象层级关系中的根对象的Transform组件。 childCount 子对象数量。 lossyScale 全局缩放比例(只读)。

    1.1K10
    领券