我在互联网上找到了这个(http://lodev.org/cgtutor/raycasting.html)教程,并且很感兴趣并希望自己创建.我想在SFML中做到这一点,我想扩展它,并制作一个3D版本,所以玩家可以走的不同级别.因此,每个像素需要1条光线,因此必须独立绘制每个像素.我找到了这个(http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array.php教程,似乎很容易使数组具有单独的顶点.首先,我认为最好的办法是创建一个可以读取光线返回的像素的类,然后将它们绘制到屏幕上.我使用了VertexArray,但由于某种原因,事情并没有奏效.我试图孤立这个问题,但我收效甚微.我写了一个只有绿色像素的简单顶点数组,它应该填满屏幕的一部分,但仍然存在问题.像素只显示我的代码和图片.我的意思
#include "SFML/Graphics.hpp"
int main() {
sf::RenderWindow window(sf::VideoMode(400, 240), "Test Window");
window.setFramerateLimit(30);
sf::VertexArray pointmap(sf::Points, 400 * 10);
for(register int a = 0;a < 400 * 10;a++) {
pointmap[a].position = sf::Vector2f(a % 400,a / 400);
pointmap[a].color = sf::Color::Green;
}
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(pointmap);
//</debug>
window.display();
}
return 0;
Run Code Online (Sandbox Code Playgroud)
}
http://oi43.tinypic.com/s5d9aw.jpg http://oi43.tinypic.com/s5d9aw.jpg
我的意思是用绿色填充前十行,但显然这不是我做的...我想如果我能弄清楚是什么导致这不起作用,我可以解决主要问题.另外如果您认为有更好的方法可以做到这一点,您可以让我知道:)
谢谢!
我在 Chrome 版本 35.0.1916.153 m 中使用three.js r67
我试图与我在场景中创建的一些自定义网格相交。尽管它们存在于 scene.children 中,但 raycaster 似乎没有注册网格。
网格创建代码:
if (modelVertices != null && modelVertices.length >= 3) {
triangles = THREE.Shape.Utils.triangulateShape ( modelVertices, holes );
for( var i = 0; i < triangles.length; i++ ){
modelGeometry.faces.push( new THREE.Face3( triangles[i][0], triangles[i][2], triangles[i][2] ));
}
modelGeometry.computeFaceNormals();
var modelMesh = new THREE.Mesh(modelGeometry, material);
modelMesh.material.side = THREE.DoubleSide;
polyhedralzGroup.add(modelMesh)
}
Run Code Online (Sandbox Code Playgroud)
光线投射代码:
var projector = new THREE.Projector();
projector.unprojectVector( vector, camera );
var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
//console.log("Work"); …Run Code Online (Sandbox Code Playgroud) 我编写了下面的代码来获得与3d形状的交点.它运作良好,但如果有两个与形状的交点,它只返回最近的交点,而我需要与形状最近的交点.我怎样才能到达最近的十字路口?
/*here I create a cube*/
var geometry0 = new THREE.Geometry()
geometry0.vertices = [new THREE.Vector3(0.5, -0.5, 0.5), new THREE.Vector3(-0.5, -0.5, 0.5), new THREE.Vector3(-0.5, -0.5, -0.5), new THREE.Vector3(0.5, -0.5, -0.5), new THREE.Vector3(0.5, 0.5, 0.5), new THREE.Vector3(-0.5, 0.5, 0.5), new THREE.Vector3(-0.5, 0.5, -0.5), new THREE.Vector3(0.5, 0.5, -0.5)];
geometry0.faces = [new THREE.Face3(3, 2, 1), new THREE.Face3(3, 1, 0), new THREE.Face3(4, 5, 6), new THREE.Face3(4, 6, 7), new THREE.Face3(0, 1, 5), new THREE.Face3(0, 5, 4), new THREE.Face3(1, 2, 6), new THREE.Face3(1, 6, 5), new …Run Code Online (Sandbox Code Playgroud) 我试图在我使用正交相机的场景中挑选物体.我的代码片段已经有效,但不准确.我已经在stackoverflow上找到了一些答案,但是这些已被弃用或根本不再有效.这是我的代码onMouseDown
function onDocumentMouseUp( event ) {
event.preventDefault();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
var pos = camera.position;
var ray = new THREE.Raycaster(pos, vector.unproject(camera).sub(camera.position).normalize());
var intersects = ray.intersectObjects(objects);
if (intersects.length > 0) {
console.log("touched:" + intersects[0]);
}
else {
console.log("not touched");
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅http://jsfiddle.net/ujzpe07t/1/
如果你点击立方体左/右/上/下的一些像素,它仍然告诉我对象被触摸了.
我正在使用three.js r69.
任何提示都将非常感激.谢谢,干杯!
我正在研究简单的策略游戏机制.我有一个军营预制件.当我在场景中添加军营并点击军营时,我收到一个NullReferenceException错误:
NullReferenceException:对象引用未设置为对象的实例PlacementController.Update()(在Assets/Scripts/PlacementController.cs:64)
当我尝试使用Raycast2D到达军营的对撞机名称时收到错误.
军营预制件有一个Box Collider2D对撞机(触发器被检查),其标签为"建筑物",其图层为"建筑物".它有一个刚体2D组件,它是一个运动刚体.
我无法弄清楚这个问题.请帮我.
谢谢你的时间.
using UnityEngine;
using System.Collections;
public class PlacementController : MonoBehaviour
{
private Buildings buildings;
private Transform currentBuilding;
private bool _hasPlaced;
public LayerMask BuildingsMask;
public void SelectBuilding(GameObject g)
{
_hasPlaced = false;
currentBuilding = ((GameObject)Instantiate(g)).transform;
buildings = currentBuilding.GetComponent<Buildings>();
}
bool CheckPosition()
{
if (buildings.CollidersList.Count > 0)
{
return false;
}
return true;
}
// Update is called once per frame
void Update () {
Vector3 m = Input.mousePosition;
m = new Vector3(m.x, m.y, …Run Code Online (Sandbox Code Playgroud) 在一个Three.js应用程序中,我想获得透视摄像头所指向的对象,并且这样做我读了raycaster文档.我发现的所有文档都谈到了使用相机和来自鼠标坐标的Vector2进行光线投射,但我不想使用鼠标的2d坐标.相机可以出于任何原因旋转:点击并拖动屏幕,触摸控制甚至VR控制,我只想从透视摄像机的中心点进行光线投射,并将其设置为"选中"它所看到的对象.
有什么建议?
我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否在距正方形中心的距离内,但我不确定这是否正确。
我的平台游戏的光线投射控制器的一个特点是玩家可以通过单向平台跳下来.这很好用,但我想添加额外的功能,如果玩家将跳跃的平台在一定距离内,玩家将只能跳下来.
我的平台控制器的跳跃功能如下所示:
我试过制作一个跳跃方法,从角色的盒子对撞机的中心创建一个新的光线投射(下面的代码中没有显示,因为到目前为止我完全不成功),并检查一定距离的碰撞.我的问题是它总是检测到它将要从中跳下的平台的对撞机,并且永远不会有机会检测到其他任何东西.
如何让这个新的光线投射忽略第一次碰撞,可能检测到光线距离内的碰撞,如果碰到某些东西让我的角色跳下来?另外,我是否需要进行新的光线投射,或者我可以在控制器上使用当前的光线投射?
这里有一些我的raycast控制器脚本,希望能够解释一些功能:
private void MoveVertically(ref Vector3 deltaMovement)
{
float directionY = Mathf.Sign(deltaMovement.y);
float rayLength = Mathf.Abs(deltaMovement.y) + skinWidth;
for (int i = 0; i < verticalRayCount; i++)
{
Vector2 rayOrigin = (directionY == -1) ? raycastOrigins.bottomLeft : raycastOrigins.topLeft;
rayOrigin += Vector2.right * (verticalRaySpacing * i + deltaMovement.x);
RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, rayLength, collisionMask);
Debug.DrawRay(rayOrigin, Vector2.up * directionY * rayLength, Color.red);
if (hit)
{
if (hit.collider.tag == "platformOneWay")
{
if (directionY == 1) …Run Code Online (Sandbox Code Playgroud) RealityKit框架中检测交叉点的方法一共有三种,但是我不知道如何在我的项目中使用它。
1.
func raycast(origin: SIMD3<Float>,
direction: SIMD3<Float>,
length: Float,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)
2.
func raycast(from: SIMD3<Float>,
to: SIMD3<Float>,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)
3.
func convexCast(convexShape: ShapeResource,
fromPosition: SIMD3<Float>,
fromOrientation: simd_quatf,
toPosition: SIMD3<Float>,
toOrientation: simd_quatf,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud) 出于某种原因,当 3D 对象工作正常时,我的 2D 叠加不会对光线投射做出反应。我已经在互联网上搜索了很长时间,但仍然找不到解决方案。(我对 C# 和 Unity 都是新手,所以我的知识有限)
如果有人可以对我遇到的这个问题有所了解,将不胜感激!
这里的问题是,当我单击 2D 覆盖时,我希望我的光标显示一条控制台消息。3D 对象工作并在控制台中显示相关消息,但由于某种原因,2D 图形未检测到光线投射命中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class rayCast_Test : MonoBehaviour
{
[SerializeField]
public GameObject TutorialUI;
public Canvas gameChara2D;
[SerializeField]
private float rayCastDistance = 25f;
[SerializeField]
float DistanceFromCamera = 1f;
private ARRaycastManager aRRaycastManager;
private Vector3 touchPos;
private Vector3 touchOrigin;
private bool onTouchHold = false;
private RaycastHit hitObject;
private void Awake()
{
aRRaycastManager = FindObjectOfType<ARRaycastManager>();
}
// Update is called once per frame
void …Run Code Online (Sandbox Code Playgroud) raycasting ×10
three.js ×4
javascript ×3
c# ×2
3d ×1
arkit ×1
c++ ×1
geometry ×1
mesh ×1
orthographic ×1
picking ×1
realitykit ×1
sfml ×1
swift ×1