我正在尝试使用射线广播检测相交。我当前的问题是我不确定我的光线投射是否朝着想要的方向瞄准。所以我的一般问题是:有没有办法使射线广播可见?如果是这样:怎么做?这对我有很大帮助。
麦可
基本上我想要创建:
我有一个带有对象的3D地图,我想选择我屏幕上的2D框x1,y1到x2,y2中的所有对象.
任何想法如何做到这一点,因为我对如何开始毫无头绪.
提前致谢!
prevX并且prevY是鼠标按下的坐标:
function onDocumentMouseUp(event) {
event.preventDefault();
var x = (event.clientX / window.innerWidth) * 2 - 1;
var y = -(event.clientY / window.innerHeight) * 2 + 1;
var width = (x - prevX); //* window.innerWidth;
var height = (y - prevY); //* window.innerHeight;
var dx = prevX; //* window.innerWidth;
var dy = prevY; //* window.innerHeight;
console.log(
dx + ',' +
dy + "," +
(dx + width) + "," +
(dy + height) +
", …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个网格的场景,每个网格都与不同的transformControl相关联; 为了选择不同的对象,我正在使用光线投射技术.我也使用轨道相机来导航场景.
每当我使用变换控制修改所选对象的位置/旋转/比例时,我想禁用相机轨道,因为有时候我点击一个选择器时,我也会选择场景的背景,所以轨道相机移动.
我想停止这种行为,我已经尝试用光线投射技术处理它,但它不起作用.
我正在使用SDL2编写一个光线投射游戏.在绘制地板时,我需要以像素方式调用SDL_RenderCopy.这导致了瓶颈,使帧率降至10 fps以下.我正在寻找性能提升,但似乎无法找到一些.
以下是性能下降的概述:
int main() {
while(true) {
for(x=0; x<800; x++) {
for(y=0; y<600; y++) {
SDL_Rect src = { 0, 0, 1, 1 };
SDL_Rect dst = { x, y, 1, 1 };
SDL_RenderCopy(ren, tx, &src, &dst); // this drops the framerate below 10
}
}
SDL_RenderPresent(ren);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作可拖动的对象,如下例所示:https://www.script-tutorials.com/demos/467/index.html
应该可拖动的对象位于数组objectMoverLines中.
我已经使用以下代码在我的场景中添加了一架飞机:
plane = new THREE.Mesh(new THREE.PlaneBufferGeometry(500, 500, 8, 8), new THREE.MeshBasicMaterial({color: 0x248f24, alphaTest: 0}));
plane.visible = false;
scene.add(plane);
Run Code Online (Sandbox Code Playgroud)
问题发生在onDocumentMouseDown函数下.出于某种原因,如果平面可见性设置为false(plane.visible = false),那么在某个点,将不会填充intersectsobjmovers.但是,如果平面的可见性设置为true,它将正常工作(但很明显,这会导致巨大的飞机妨碍一切):
function onDocumentMouseDown(event) {
// Object position movers
var vector = new THREE.Vector3(mouse.x, mouse.y, 1);
vector.unproject(camera);
raycaster.set( camera.position, vector.sub( camera.position ).normalize() );
var intersectsobjmovers = raycaster.intersectObjects(objectMoverLines);
if (intersectsobjmovers.length > 0) {
console.log('clicking an object mover');
// Disable the controls
controls.enabled = false;
// Set the selection - first intersected object
objmoverselection = intersectsobjmovers[0].object; …Run Code Online (Sandbox Code Playgroud) Unity的Raycast函数有一个参数可用于光线投射到特定的GameObject.您还可以使用该参数来忽略特定的GameObject.
例如,Raycast功能:
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
Run Code Online (Sandbox Code Playgroud)
该layerMask参数用于指定哪些对象应该/不应该接收光线投射.
1.如何光线投射到名为"立方体"的图层中的特定 GameObject?
2.如果你在场景中有10个 GameObjects,但是你只想光线投射到2个 GameObjects并忽略其余的那些?你是怎样做的?
假设那些对象的层是"立方体"和"球体".
3.如果你想要对所有 GameObjects 进行光线投射但忽略1,那该怎么办?
假设要忽略的GameObject位于"立方体"层中.
4.如果你想要对所有 GameObjects 进行光线投射但忽略2个(多个)GameObjects,那该怎么办?
同样,要忽略的层是"立方体"和"球体"层.
我需要使用渲染的深度图从屏幕空间位置计算3D坐标。不幸的是,使用常规光线追踪对我来说不是一种选择,因为我要处理的单个几何图形包含大约5M张面。
所以我想我将执行以下操作:
这种工作,但是以某种方式定位点总是在物体的后面,因此我的深度计算可能有问题。
渲染深度图非常简单:
const depthTarget = new THREE.WebGLRenderTarget(w, h);
const depthMaterial = new THREE.MeshDepthMaterial({
depthPacking: THREE.RGBADepthPacking
});
// in renderloop
renderer.setClearColor(0xffffff, 1);
renderer.clear();
scene.overrideMaterial = depthMaterial;
renderer.render(scene, camera, depthTarget);
Run Code Online (Sandbox Code Playgroud)
使用以下命令在鼠标位置查找存储的颜色值:
renderer.readRenderTargetPixels(
depthTarget, x, h - y, 1, 1, rgbaBuffer
);
Run Code Online (Sandbox Code Playgroud)
并使用(从packing.glsl中的GLSL版本改编)转换回float:
const v4 = new THREE.Vector4()
const unpackDownscale = 255 / 256;
const unpackFactors = new THREE.Vector4(
unpackDownscale / (256 * 256 * 256),
unpackDownscale / (256 * 256),
unpackDownscale / 256,
unpackDownscale
); …Run Code Online (Sandbox Code Playgroud) 免责声明:我对Unity3D和ARCore还是很陌生,所以请多多包涵。
我在Unity3D中使用ARCore创建一个场景,用户可以在其中选择ScrollView屏幕上的模型,然后使用Google的ARCore框架放置它们。
到目前为止,我已经开始工作了;用户触摸中的模型ScrollView(该模型在屏幕上显示Panel为当前选定的模型,因为我的计划是要具有ScrollView切换可见性以获取更多的屏幕视图空间)。
问题在于,当用户选择模型时,ARCore会将模型放置在检测到的平面上,该平面位于ScrollView和选择的模型Panel对象所在的位置(即使您初次触摸以开始滚动ScrollView)。请参阅下文以帮助可视化。
如何使ARCore 不会将对象放置在ScrollView和之后Panel?我尝试过的是在控制器(实际上只是Google HelloARController)中添加了一个对象集合,这些对象我想阻止ARCore Raycast并使用进行遍历,foreach以查看集合中是否Raycast命中了GameObjects
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
//my code; above is Google's
foreach (var item in BlockingObjects) { //BlockingObjects is a List<GameObject>
if (IsTouchInObject(FirstPersonCamera.ScreenPointToRay(touch.position), item)) {
return;
}
}
//end of my code; below is Google's
TrackableHit hit;
TrackableHitFlag …Run Code Online (Sandbox Code Playgroud) 有没有人解释为什么下面的交互式立方体不适用于视网膜显示器mac?
http://mrdoob.github.io/three.js/examples/canvas_interactive_cubes.html
该代码适用于非视网膜macbook中的Firefox,Safari和Chrome,但在具有视网膜显示的mac中不起作用.
Macs:macbook pro视网膜显示器,imac视网膜显示器,macbook pro 2011(无视网膜显示器)全部运行Yosemite
浏览器版本:Firefox 36,Safari版本8.0.3(10600.3.18),Chrome版本40.0.2214.115(64位)
raycasting ×10
three.js ×6
javascript ×4
2d ×1
android ×1
arcore ×1
bitmask ×1
c# ×1
c++ ×1
depth-buffer ×1
game-engine ×1
glsl ×1
graphics ×1
intersection ×1
opengl ×1
performance ×1
sdl-2 ×1