Translate方法和MovePosition方法的区别

博客介绍了u3d里物体移动的方法,着重对比了transform.Translate和rigidbody.MovePosition。transform.Translate可直接改变物体位置,但刚体碰撞后会不规则运动;rigidbody.MovePosition考虑物理引擎,使用时参数要加自身位置,刚体碰撞不影响后续移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

u3d里物体移动的方法有很多种,初学者最容易弄混淆的是transform.Translate和rigidbody.MovePosition。
都是移动,这两者到底有什么区别呢?
其实transform.Translate相当于直接改变物体的位置,可以参照自身坐标系或者世界坐标系,如果物体本身不是刚体,这个方法完全可以搞定,但如果物体是刚体,这个方法在刚体发生了碰撞后会发生不规则运动(实测)。
而MovePosition方法考虑到了物理引擎的东西。
但是MovePosition使用的时候也有坑,比如直接在Update里写rigidbody.MovePosition(vector3.forward)你会发现根本运动不了。
这个方法需要在参数里加上自身的位置。比如写成rigidbody.MovePosition(transform.position + Vector3.forward),你会发现可以正常使用了,而且刚体间的碰撞不会影响接下来的移动,美滋滋!

要在不影响 QTextDocument 的 `cursor.insert()` 方法的情况下添加页码,可以使用 QTextDocument 的 `drawContents()` 信号来监听文档内容的绘制过程,然后在该信号的槽函数中绘制页码。 示例代码如下: ```python from PyQt5.QtGui import QTextCursor, QTextDocument, QTextFormat, QPainter from PyQt5.QtCore import Qt, QMarginsF, QRectF, QSizeF, pyqtSignal class MyTextDocument(QTextDocument): def __init__(self, parent=None): super(MyTextDocument, self).__init__(parent) self._pageNumberFormat = QTextFormat() self._pageNumberFormat.setFontPointSize(10) self._pageNumberFormat.setBottomMargin(1) self._pageNumberFormat.setAlignment(Qt.AlignRight | Qt.AlignBottom) self._pageNumberFormat.setObjectType(QTextFormat.UserFormat) self.drawContents.connect(self.onDrawContents) def setPageNumberFormat(self, pageNumberFormat): self._pageNumberFormat = pageNumberFormat def onDrawContents(self, painter, rect): cursor = QTextCursor(self) pageNumber = 1 while not cursor.atEnd(): block = cursor.block() if block.isVisible(): blockRect = self.documentLayout().blockBoundingRect(block) if blockRect.intersects(rect): painter.save() painter.translate(blockRect.topLeft()) painter.setClipRect(blockRect.translated(-blockRect.topLeft())) cursor.setPosition(block.position()) while not cursor.atEnd(): fragment = cursor.fragment() if fragment.isVisible(): fragmentRect = self.documentLayout().fragmentBoundingRect(fragment) if fragmentRect.intersects(rect): painter.drawStaticText(fragmentRect.topLeft(), fragment.staticText()) if fragment.text() == '\n': pageNumber += 1 pageNumberStr = "Page " + str(pageNumber) pageNumberFormat = QTextCharFormat(self._pageNumberFormat) pageNumberFormat.setForeground(painter.pen().brush()) pageNumberFormat.setProperty(QTextFormat.UserProperty, pageNumberStr) self.documentLayout().draw(painter, pageNumberFormat, QRectF(fragmentRect.right() - 100, fragmentRect.bottom() - 20, 100, 20), cursor) cursor.movePosition(QTextCursor.NextFragment) painter.restore() cursor.movePosition(QTextCursor.NextBlock) ``` 在上述代码中,我们通过 `setPageNumberFormat()` 方法设置页码的格式(默认为字号为 10,底部边距为 1,右对齐)。然后,我们连接了 `drawContents` 信号的槽函数 `onDrawContents()`。在该函数中,我们首先遍历文档中的块,然后遍历块中的片段,绘制文本。如果遇到换行符,则绘制页码,并将页码字符串保存在片段的 `UserProperty` 中。最后,我们使用 `draw()` 方法绘制页码。由于页码是一个自定义格式对象,因此我们需要将其转换为 `QTextCharFormat` 对象。在 `draw()` 方法中,我们将页码绘制到片段的右下角。 需要注意的是,由于我们在 `drawContents` 信号的槽函数中绘制页码,因此在使用 `cursor.insert()` 方法插入文本时,页码不会自动更新。如果需要更新页码,可以手动调用 `document().update()` 方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值