- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
到目前为止,我一直在使用 THREE.Raycaster
成功测试游戏引擎中许多内容的碰撞,它非常棒,而且运行良好。
但是,最近我遇到了一些很奇怪的事情,我似乎无法弄清楚。从我的 Angular 来看,我的逻辑和代码是合理的,但预期的结果不正确。也许我只是错过了一些明显的东西,所以我想我应该寻求一些帮助。
我从一组网格体顶部的中心以圆弧方式逐个转换光线。这些网格体都是父级 Object3D
的子级,目标是测试原始网格体和其他也是父级子级的网格体之间的碰撞。为了测试我的光线,我使用了 THREE.ArrowHelper
。
这是我的代码结果的图像 - /image/DjW0f.jpg
在此图像中,ArrowHelper
对象的位置(原点:方向)正是我想要的。但是,是的,这张图片有问题,生成此图片的代码是:
var degree = Math.PI / 16,
tiles = this.tilesContainer.children,
tilesNum = tiles.length,
raycaster = new THREE.Raycaster(),
rayDirections, rayDirectionsNum, rayOrigin, rayDirection, collisions,
tile, i, j, k;
for (i = 0; i < tilesNum; i++) {
tile = tiles[i];
rayOrigin = new THREE.Vector3(
tile.position.x,
tile.geometry.boundingBox.max.y,
tile.position.z
);
rayDirections = [];
for (j = 0; j < Math.PI * 2; j += degree) {
rayDirections.push(new THREE.Vector3(Math.sin(j), 0, Math.cos(j)).normalize());
}
rayDirectionsNum = rayDirections.length;
for (k = 0; k < rayDirectionsNum; k++) {
rayDirection = rayDirections[k];
raycaster.set(rayOrigin, rayDirection);
collisions = raycaster.intersectObjects(tiles);
this.testRay(rayOrigin, rayDirection, collisions);
}
}
testRay
方法如下所示:
testRay: function (origin, direction, collisions) {
var arrowHelper = new THREE.ArrowHelper(
direction,
origin,
1,
(collisions.length === 0) ? 0xFF0000 : 0x0000FF
);
this.scene.add(arrowHelper);
}
现在,显然这张图片有些不对劲。与其他网格碰撞的光线应为蓝色,而不碰撞的光线应为红色。从这张图像中可以清楚地看出,有些东西完全不正常,当我检查碰撞时,我得到了一些非常不正常的结果。对于图像中显示为蓝色的许多光线,我遇到了大量的碰撞,有时单条光线发生 30 次碰撞,但其他光线则没有发生任何碰撞,即使它们紧邻其他图 block 。
我就是不知道它可能是什么。怎么会有那么多本应是蓝色的光线却变成了红色?关卡边缘的图 block 发出的光线如何与不存在的图 block 发生蓝色碰撞?
对于这个问题我真的很摸不着头脑(读:反复敲打我的头),任何帮助将不胜感激!
最佳答案
该解决方案实际上位于此代码之外,并且至少我不相信与过时的 r68
版本相关。
制作图 block 网格时,我需要为其设置三个属性
tileMesh.matrixAutoUpdate = false;
tileMesh.updateMatrix();
tileMesh.updateMatrixWorld(); // this is new
我正在做前两个,但不是最后一个。为什么这是必要的,我不知道,这对我来说似乎有点奇怪,但这就是解决我的问题的原因。我在场景中有一个 AxisHelper ,如果您查看原始图像,您会注意到所有蓝色的 ArrowHelper 对象实际上都指向 AxisHelper
。这真的很奇怪,因为 AxisHelper 被添加到场景中,而不是添加到tilesContainer 中。将 ArrowHelper
对象添加到 tilesContainer
没有帮助。
渲染场景的过程在将 AxisHelper 添加到场景之前以及初始渲染发生之前运行光线转换器代码。如果我在添加 AxisHelper 后移动 raycaster 代码调用,问题也得到解决,但这是一个 hacky 解决方案。
因此,真正的解决方法是将 .updateMatrixWorld()
添加到图 block 中。现在的结果看起来像这样 /image/1HfA0.jpg ,这是正确的(ArrowHelper
对象的长度已缩短,因此它们不会重叠)。
非常感谢Manthrax感谢他在这件事上的帮助。
关于javascript - 使用 THREE.Raycaster 进行碰撞检测时遇到奇怪的情况 (r68),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37763790/
我正在创建一个 sql server 存储过程,它将输入作为逗号分隔的 productid 或选项“全部”。当用户传入逗号分隔的产品 ID 时,查询应输出所有产品 ID 的数据。我使用“IN”语句执行
我有一个自动生成的 Web 服务客户端。我有很多复杂的类,我必须对其进行模式匹配。现在我的结构如下所示: val response = client.getResponse response matc
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 7年前关闭。 Improve this
我需要正确的 tsql 语法来解决这个问题: Select * from table where var_A='10' select * from table where var_B='10' 何时使
我遇到了这个问题。每当我运行程序并在需要时键入字母 m 时,我的 if 语句都不会识别它。有人知道为什么吗?我已经这样做了一个小时,但没有结果。 #include #include #includ
我从数据库列名称“你有护照”创建了一个表,用户回答是或否我如何将 css 应用到这个动态工作的表。 table, th, td { border: 1px solid black;
我对 LocationListener 类的 onStatusChanged 有一些疑问。 它知道它可以呈现三种状态:AVAILABLE、TEMPORARILY_UNAVAILABLE 和 OUT_O
当引入新的异常类型时,我总是不确定如何正确地做到这一点。有共同约定吗?你怎么做呢? 我对您组织它们的范围感兴趣(将它们保留在它们所使用的单元中?在组件级别有一个单元?包级别?应用程序?) 这也会影响命
我使用以下内容创建了日期维度: https://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-D
您好,我正在使用 Android 完全 Kiosk 浏览器,该浏览器使用 chrome Webview。但是 javascript 中的某些方法或函数无法正常工作,例如 window.print()。
我有以下代码: public void OpenFile(string FileName) { if (FileName == null)
获取索引越界异常 for (int recordData = 0; recordData < recordDataList.size(); recordData++) {
我使用它在发生错误时在登录中显示一条消息: × Invalid user or password
这是我的场景,我有一个异常列表,其中包含来自不同层次结构的任意异常,下面的代码快照将解释我需要做什么 private List connectionExceptions; try { // tryin
我尝试动态更新 Jtextpane 中的左缩进。但我不能!这是我尝试过的! DefaultStyledDocument document = (DefaultStyledDocument) textp
我不知道为什么这个异常不起作用...... import java.util.*; public class a { public static void main(String[] args
我目前在 case 中使用多个 when 时遇到问题。当我删除第二个当时,它就起作用了。这是什么问题? 报告的MYSQL错误为: #1064 - You have an error in your S
例如,我有一个表记录用户查看和下载文件的事件, file_id user activity 2 Tim view 1 Ron
这是一个非常愚蠢的问题,但我需要一点安慰/帮助。我有当前的“递归”情况: void add( int value ) { // do something ... // if ( conditi
我尝试使用以下代码在按钮数组上注册回调。但我似乎无法理解如何绑定(bind)回调中需要的字符串。任何建议将不胜感激! for (var i = 0; i < this.car_types.length
我是一名优秀的程序员,十分优秀!