我有一个"W x H x D"体积数据,除了包含1的小球形体积外,到处都是零.
我编写了着色器来提取该3D体积与由顶点构成的通用对象的"交集".
顶点着色器
varying vec3 textureCoordinates;
uniform float objectSize;
uniform vec3 objectTranslation;
void main()
{
vec4 v=gl_Vertex;
textureCoordinates= vec3( ((v.xz-objectTranslation.xz)/objectSize+1.0)*0.5, ((v.y-objectTranslation.y)/objectSize+1.0)*0.5);
gl_Position = gl_ModelViewProjectionMatrix*v;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
varying vec3 textureCoordinates;
uniform sampler3D volumeSampler;
void main()
{
vec4 uniformColor = vec4(1.0,1.0,0.0,1.0); //it's white
if ( textureCoordinates.x <=0.0 || textureCoordinates.x >= 1.0 || textureCoordinates.z <= 0.0 || textureCoordinates.z >= 1.0)
gl_FragColor =vec4(0.0,0.0,0.0,1.0); //Can be uniformColor to color again the thing
else
gl_FragColor = uniformColor*texture3D(volumeSampler, textureCoordinates);
}
Run Code Online (Sandbox Code Playgroud)
在OpenGL程序中,我正在从(0,100,0)眼坐标看到中心对象上带有几乎球形的白色斑块,但是我想要另一个观察者(0,0,0)那个躺在它上面的球体相同的视线被正确遮挡,因此只发出我在图片中用红色加下划线的部分.
这是光线投射或类似的应用吗?
当我在JavaFX中创建我的第一个3D游戏时 - 您可以使用鼠标从零件组装船只.这提出了一个问题,因为JAVAFX似乎没有用于将PerspectiveCamera屏幕2D坐标转换为场景3D空间的原生元素.
这是我正在努力实现的目标.鼠标移动的块应在假想的平面上移动,该平面始终相对于摄像机旋转90°:
我试图用三角函数解决问题而没有太大的成功.我没有附加代码片段,因为我正在寻找更通用的数学解决方案,但如果需要,我会提供它.
所有帮助将不胜感激!
期望的结果:
我已经整理了一个使用jsonloader和three.js显示多个网格的WebGL脚本,现在我想添加MouseOver和onClick事件.第一个是当鼠标悬停在网格上时简单地改变网格的颜色:
function render() {
requestAnimationFrame(render);
mesh.rotation.z += 0.090;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children);
for (var i = 0; i < intersects.length; i++) {
intersects[i].object.material.color.set(0xff0000);
}
renderer.render(scene, camera);
}
Run Code Online (Sandbox Code Playgroud)
上面的渲染功能允许我将任何网格的颜色悬停在它上面.我已经尝试了几个if/else变体尝试并且只有在鼠标悬停在网格上时才能使用此效果,但我无法使其工作 - 它只是保持红色.任何人都可以建议我如何修改我的脚本?
谢谢.
我是新手,目前正在构建一个与 AR 相关的应用程序,在旧版本上我说了这个
let results = self.hitTest(screenPosition, types: [.featurePoint])
Run Code Online (Sandbox Code Playgroud)
现在我遇到了一个问题,即在 iOS 14.0 中不推荐使用 hitTest
hitTest(_:types:)' was deprecated in iOS 14.0: Use [ARSCNView raycastQueryFromPoint:allowingTarget:alignment]
Run Code Online (Sandbox Code Playgroud)
请告诉我如何解决它,谢谢:)
假设我们在A点有一个物体.它想知道它是否可以移动到B点.它的速度有限,所以它只能一步一步地移动.它向正在移动的方向投射光线.Ray与一个对象碰撞,我们检测到它.如何安全地传递我们的光线(避免碰撞)?
顺便说一句,有没有办法让这种东西在对象投射的情况下工作,它会像简单的光线投射一样快/近吗?
有没有办法在某些vay路径中找到最优?
我正在尝试从我的相机中对鼠标进行光线投射,以便在我的场景中对网格进行一些悬停和点击事件.
我的问题是,我的相机目前是另一个网格的子对象(为了更容易的相机移动/旋转),现在我的光线投射不起作用(我假设因为相机是网格的孩子,而不是场景).
这是我的代码的一部分:
//camera setup
var camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight, 0.1, 1000);
var cameraTargetGeom = new THREE.SphereGeometry(0.5);
var cameraTargetMaterial = new THREE.MeshLambertMaterial({color: 0xff0000, ambient: 0xff0000});
var cameraTarget = new THREE.Mesh(cameraTargetGeom, cameraTargetMaterial);
cameraTarget.position.set(0.15, 0, 5);
scene.add(cameraTarget);
cameraTarget.add(camera);
camera.position.y = 18;
camera.rotation.x = Math.PI * -90 / 180;
// click event
renderer.domElement.addEventListener('click', clickedCanvas);
function clickedCanvas(e) {
e.preventDefault();
mouse.x = (e.clientX / renderer.domElement.width) * 2 - 1;
mouse.y = -(e.clientY / renderer.domElement.height) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children, …
Run Code Online (Sandbox Code Playgroud) 我想知道我的raycaster是否在看我装的OBJ.由于从Cinema4D导出的方式,我相信OBJ是一个有3个孩子的THREE.Group,而不是THREE.Object.我可以只更改我的raycaster代码行来查找该组而不是对象吗?
raycaster.set(controls.getObject().position, controls.getDirection(), 0, 40)
var intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {
//CURRENTLY INTERSECTING SOMETHING
for (var i = 0; i < onOffCubes.length; i++) {
//if the first thing the raycaster sees is a one of my cubes
if (intersects[0].object == onOffCubes[i]) {
ExperiencesData[i].userClose = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
onOffCubes是一个包含6个OBJ/THREE.js组的数组:
我正在使用 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) 我正在使用画布在 JavaScript 中构建光线投射引擎,我已经构建了光线投射器并且其完全正常工作,除了一个问题,有鱼眼效果,我尝试进行修正
var d = (Math.sqrt( Math.pow((rays[i].x - rays[i].newX),2 )+Math.pow((rays[i].y - rays[i].newY),2 )))
// my attempted corection
var correctedDis = d * Math.cos((rays[i].rayAngle - player.rot))
Run Code Online (Sandbox Code Playgroud)
但它不会产生任何结果:
我仔细检查了数学,我没有发现任何问题,但我可能仍然做错了,因为我七年级,还没有学到很多关于三角学的知识,(只参加了可汗学院课程)所以有人可以让我知道是否有更好或更简单的方法,提前谢谢您。
(我还认为我可能做错了阴影,如果有人可以帮忙的话。)
编辑:我忘了包括您可以使用 WASD 键来控制演示,并且图像被翻转,但这将是一个简单的修复。 如果您需要的话,我的完整代码:
var d = (Math.sqrt( Math.pow((rays[i].x - rays[i].newX),2 )+Math.pow((rays[i].y - rays[i].newY),2 )))
// my attempted corection
var correctedDis = d * Math.cos((rays[i].rayAngle - player.rot))
Run Code Online (Sandbox Code Playgroud)
const scale = (num, in_min, in_max, out_min, out_max) => {
return (num - in_min) * (out_max - out_min) / (in_max - in_min) + …
Run Code Online (Sandbox Code Playgroud)