我正在尝试使用Python来判断一个点是否在SVG路径中.
我将使用的算法是光线投射算法.
但是对于这个算法,我需要有多边形边,但我所拥有的是svg路径的pathdata:
<path
d="m 362.26878,978.51017 c 20.15947,-20.15479 23.0826,-25.35876
20.51836,-36.58367 -5.62899,-24.66928 -8.85902,-84.94939
-4.6845,-87.51832 2.29504,-1.43086 25.27371,2.13445 51.0669,7.87678
39.48315,8.80707 50.0611,13.213 66.91495,27.88988 11.39966,9.91685
25.01402,17.41113 31.62525,17.41113 12.91547,0 24.69288,-11.04544
19.95645,-18.71919 -1.68587,-2.73893 4.50508,-38.63785 13.76077,-79.78795
12.41964,-55.21781 16.82552,-85.81829 16.82552,-116.84379 0,-23.12039 … z" />
Run Code Online (Sandbox Code Playgroud)
对应于此图片:

那么,有没有办法获得路径的一面?
我正在尝试使用光线投射画一条线.基本上我想设置一些来自我的"玩家"对象的线路.
(如下所示:https://gamedev.stackexchange.com/questions/35013/how-to-handle-3d-collisions-using-raycasting-with-a-reflection-vector)
我想要这样我就可以使用我可以直观地看到我的碰撞检测.
我知道我可以用不同的方式进行碰撞检测,但我用这种方式作为学习检测.
我的问题是下面的代码绘制一条线但它似乎随机改变长度而不总是指向相同的角度.
var ray = new THREE.Ray( player.model.objects.position, new THREE.Vector3(1, 1, 1));
var geometry = new THREE.Geometry();
// my issue is here. I don't think this is the right way use a ray to workout the second vector?
// EDIT: Realized this should be set at player position and outwards.
//var newx = 300 * ray.direction.x;
//var newz = 300 * ray.direction.z;
// EDIT CODE UPDATE
var newx = (player.model.objects.position.x) + (60 * …Run Code Online (Sandbox Code Playgroud) 我在three.js的帮助下可视化3d数据点(我通过csv文件读入).我想点击PointCloud中的点来显示这些特定点的其他测量数据.根据实例我发现这显然是可能的,但我没有让它工作.我有以下代码(基本上来自这些示例):
function onDocumentMouseMove(e) {
mouseVector.x = 2 * (e.clientX / containerWidth) - 1;
mouseVector.y = 1 - 2 * (e.clientY / containerHeight);
var vector = new THREE.Vector3(mouseVector.x, mouseVector.y, 0.5).unproject(camera);
raycaster.ray.set(camera.position, vector.sub(camera.position).normalize());
scene.updateMatrixWorld();
intersects = raycaster.intersectObject(particles);
console.log(intersects);
}
Run Code Online (Sandbox Code Playgroud)
但是无论我移动到哪一点,相交总是一个空数组.
关于粒子对象,我写了以下内容:
geometry = new THREE.Geometry();
for (var i = 0; i < howmany; i++) {
var vector = new THREE.Vector3(data[i][0], data[i][2], data[i][1] );
geometry.vertices.push(vector);
}
attributes = {
size: { type: 'f', value: [] },
customColor: { type: 'c', value: [] } …Run Code Online (Sandbox Code Playgroud) 我正在使用 Three.js 进行网络可视化,但无法确定为什么我的光线投射实现没有识别正确的点(完整示例和来源)。
更具体地说,我正在尝试将光线投射与点云一起使用,并尝试在用户悬停在该点上时将点的颜色更改为白色。现在,悬停点确实会改变点的颜色,但该事件似乎是在光标附近的点上触发的,而不是在光标正下方的点上。
这是我用来初始化光线投射器的代码:
// configure the raycaster
raycaster = new THREE.Raycaster();
raycaster.params.Points.threshold = 20;
Run Code Online (Sandbox Code Playgroud)
这是渲染函数:
function render() {
renderer.render(scene, camera);
controls.update();
raycast();
}
// Color hovered points
function raycast() {
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObject(particles);
if (intersects.length) {
var newColor = new THREE.Color();
newColor.setRGB( 1, 1, 1 );
var index = intersects[0].index;
particles.geometry.colors[index] = newColor;
particles.geometry.colorsNeedUpdate=true;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,mousemove在主体上触发的事件回调:
/**
* Mouse coordinates go from 0 to container width {0:1}
* …Run Code Online (Sandbox Code Playgroud) 大家好,谢谢帮忙
我想要做的非常简单,我正在尝试显示一个跟随我的弹跳/反射 Raycast 的线渲染器。
这是我到目前为止所拥有的。
private LineRenderer lr;
public int maxReflectionCount = 3;
public float maxStepDistance = 200f;
void Start()
{
lr = GetComponent<LineRenderer>();
}
void Update()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
if (hit.collider)
{
lr.SetPosition(1, new Vector3(0, 0, hit.distance));
Reflect(this.transform.position + this.transform.forward * 0.75f, this.transform.forward, maxReflectionCount);
}
}
else
{
lr.SetPosition(1, new Vector3(0, 0, 2000));
}
}
private void Reflect(Vector3 position, Vector3 direction, int reflectionsRemaining)
{
if (reflectionsRemaining == 0)
{
return;
}
Vector3 startingPosition …Run Code Online (Sandbox Code Playgroud) 我在基于网络的赛车游戏中使用 Three.js Raycaster 方法。但由于计算量很大,它会消耗大量的 CPU 周期,从而导致 fps 下降。我正在考虑在WebWorker上导出Three.js的RayCaster方法。谁能指导我如何实现它,或者这是否可能?
我正在尝试将光线投射到 TextGeometry 的 boundingBox。当前,当单击不在字母周围或字母之间的字母时,光线投射适用于 textGeometry。如果单击位于文本字母/字母表之间,则没有对象与 intersectObjects() 相交。当单击也在字母之间时,我需要光线投射与 textGeo 对象相交。
我将 TextGeometry 定义为:
var textGeo = new THREE.TextGeometry( text, {
size: size,
height: 1,
font: 'helvetica'
});
textGeo.computeBoundingBox();
var textMaterial = new THREE.MeshBasicMaterial({ color: fontColor });
var textMesh = new THREE.Mesh(textGeo, textMaterial);
Run Code Online (Sandbox Code Playgroud)
在寻找解决方案后,使用 boundingBox 似乎是最好的方法。请建议或指出如何实现这一点。关于如何做到这一点的任何想法或提示?或者如果有任何当前可用的方法。
我将如何使光线投射与边界框相交?
我有一个从 UnityEngine.EventSystems 实现 IDragHandler 和 IDropHandler 的游戏对象。
在 OnDrop 中,我想检查一下,这个对象是否被放置在另一个对象的前面。我正在使用 Physics.Raycast,但它仅在某些情况下返回 true。我使用屏幕点到光线作为我的光线方向,并将此变换作为 Raycast 光线的原点。
我的代码:
public void OnDrop(PointerEventData eventData)
{
var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
var thisToObjectBehind = new Ray(transform.position, screenRay.direction);
Debug.DrawRay(thisToObjectBehind.origin, thisToObjectBehind.direction, Color.yellow, 20.0f, false);
RaycastHit hit;
if (Physics.Raycast(thisToObjectBehind, out hit))
{
Debug.LogFormat("Dropped in front of {0}!", hit.transform);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用透视相机。当对象直接从屏幕/相机放置在对象前面时,Physics.Raycast 有时会返回 true,但“hit”包含这个,而不是后面的对象。有时它返回false。这两个结果都不是预期的,这背后有一些物体应该可以用于 Raycast。
当对象被放置在摄像机视图外围的前面对象中时,Physics.Raycast 成功找到后面的对象。
Debug 射线看起来不错,它是从我放下的对象中绘制的,向后绘制到它应该击中的对象。
所以我对 C# 的随机数学有点陌生,我学会了如何制作步枪、手枪等。但我想学习如何使用光线投射而不是射弹制作霰弹枪。对于光线投射,我厌倦了做超过 1 次光线投射,但不知道如何使它们随机,所以现在我只能使用 1 次光线投射。我想在拍摄时进行随机传播。这是脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShotGun : MonoBehaviour {
private int pellets = 9;
private float spreadAngle = 10f;
private float damage = 10f;
private float range = 1000f;
private Camera fpsCam;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (Input.GetButtonDown("Fire1"))
{
ShotgunRay();
}
}
private void ShotgunRay()
{
RaycastHit hit;
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, …Run Code Online (Sandbox Code Playgroud) 当鼠标位于门(红色区域)时我想做点什么。我正在尝试投射射线,但射线没有击中门,而且我无法找到它到底击中的位置。另外我怎样才能发出Debug.DrawRay这条射线?
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
if (hit.collider.tag == "InteractiveDoor")
{
doorInteractGameObject.SetActive(true);
}
else
{
doorInteractGameObject.SetActive(false);
}
}
Run Code Online (Sandbox Code Playgroud)