| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 196 人关注过本帖
标题:想请教一下 directx3d游戏开发编程 书中的拾取
只看楼主 加入收藏
beginner_
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-12-25
结帖率:100%
  已结贴   问题点数:20  回复次数:4   
想请教一下 directx3d游戏开发编程 书中的拾取
首先说明,这本书的封面是一个龙头;
里面在拾取一章给了三个函数,分别是计算射线、变换坐标和射线与外接球体相交测试;
我觉得之所以用外接球体,可能是因为 被拾取目标(茶壶)是不规则物体,所以用球体;
而我现在想测试一个立方体,考虑 到是规制物体;应有更好的写法;
无奈 才疏智短,没法理解第三个函数,所以想请教一下,如果外接体换成立方体的话,第三个函数的写法,或思路是什么

另附上书中的三个函数及结构体:
struct sRay {
    D3DXVECTOR3 _origin;
    D3DXVECTOR3 _direction;
};
struct BoundingSphere {
    BoundingSphere() {};
    D3DXVECTOR3 _center;
    float _radius;
};
d3d::sRay d3d::CalcPickingRay(IDirect3DDevice9 *lpDevice, int x, int y) {
    float px = 0.0f;
    float py = 0.0f;
    D3DVIEWPORT9 vp;
    lpDevice->GetViewport(&vp);
    D3DXMATRIX proj;
    lpDevice->GetTransform(D3DTS_PROJECTION, &proj);
    px = (((2.0f * x) / vp.Width) - 1.0f) / proj(0, 0);
    py = (((-2.0f * y) / vp.Height) + 1.0f) / proj(1, 1);
    d3d::sRay ray;
    ray._origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
    ray._direction = D3DXVECTOR3(px, py, 1.0f);
    return ray;
}

void d3d::TransformRay(sRay * ray, const D3DXMATRIX * T) {
    D3DXVec3TransformCoord(&ray->_origin, &ray->_origin, T);
    D3DXVec3TransformNormal(&ray->_direction, &ray->_direction, T);
    D3DXVec3Normalize(&ray->_direction, &ray->_direction);
}

bool d3d::RaySphereIntTest(const sRay *ray, const BoundingSphere *Sphere) {
    D3DXVECTOR3 v = ray->_origin - Sphere->_center;
    float b = 2.0f * D3DXVec3Dot(&ray->_direction, &v);
    float c = D3DXVec3Dot(&v, &v) - (Sphere->_radius * Sphere->_radius);

    float discriminant = (b * b) - (4.0f * c);

    if (discriminant < 0.0f)
        return false;
    discriminant = sqrtf(discriminant);

    float s0 = (-b + discriminant) / 2.0f;
    float s1 = (-b - discriminant) / 2.0f;

    if (s0 >= 0.0f || s1 >= 0.0f)
        return true;
    return false;
}
2018-12-25 10:14
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:30
帖 子:435
专家分:2166
注 册:2016-11-7
  得分:14 
跟什么形状没有关系
拾取的过程分成三步
1. 得到鼠标当前的坐标, 但是这个坐标不是坐标系里的坐标, 需要通过转换把它转为坐标系中的坐标
2. 有了坐标系内的坐标之后还不够, 因为这只是一个点, 不可能那个点刚好点在物体上, 于是要做一条射线
3. 有了射线的方程式, 最后只要对射线和要拾取的物体做一个检测, 射线是否与其相交就可以了. 这也就是第三个函数所做的事情
2018-12-25 20:13
beginner_
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-12-25
  得分:0 
回复 2楼 Jonny0201
多谢回答
确实没什么关系;但我想问,如果想测试 射线是否和立方体相交的话,第三个函数和对应的结构应该怎么改
或者 仍然用外接球体?
我认为用外接球体就不太精准了,但又不知道如何修改

[此贴子已经被作者于2018-12-25 23:18编辑过]

2018-12-25 23:17
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:30
帖 子:435
专家分:2166
注 册:2016-11-7
  得分:0 
回复 3楼 beginner_
就目前来讲, 外接球可能就是最好的方案了
如果你一定要检测边界外面多出来的那一点, 就要额外加一些算法
你可以转换一下渲染, 把这个长方体放入一个显示出来的外接球中, 只要最终渲染的结果合理并且不会格格不入, 我觉得就算 OK 了
2018-12-27 00:02
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:30
帖 子:435
专家分:2166
注 册:2016-11-7
  得分:0 
如果确实想要写的话, 建议 Google 或者到国外的论坛交流一下
这方面我不是很专业, 所以给不了你太好的建议
2018-12-27 00:05







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035008 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved