Articles of 3d

如何使世界各地的我的世界?

大家! 我感兴趣的是有没有一个游戏,或者至less有一个例子显示我的世界如何转向球体? 想法是,有像立方体一样的球体,但它们在表面上。 这必须让这个玩家可以环游世界。 math? 码? 例子? …对我的英语感到抱歉。 🙂

剪切/reflection/放大如何用4x4matrix表示?

我明白,4×4matrix可以表示一个3d点(表示为x,y,z,w) 例如,翻译是 [1 0 0 0] [0 1 0 0] [0 0 1 0] [xyz 1] 其中x,y和z是沿每个轴移动点的量。 我知道如何表示平移,缩放和旋转,但其他变换如剪切(具有任何不变平面和剪切因子),reflection(在任何平面中)和扩大(以任何中心和任何比例因子)表示? 最终目标是让c ++函数创建一个转换matrix。 例如: Matrix4x4.generateReflection(Vector3d planeNormal); Matrix4x4.generateEnlargment(float centerX, float centerY, float centerZ, float scaleFactor); 这些将返回一个Matrix4x4类的实例,其中设置的元素使得它乘以一个点返回剪切/reflection/放大的点。

用纹理导出对象或场景

有没有办法将一些工作导出或发布到一个文件夹,这样别人就可以打开.max文件,而不必重新分配所有的纹理? 我的问题是,我用完全不同的文件夹树中的纹理文件夹直接使用了大量的纹理。 所以当我把文件发给其他人时,他需要重建这个树,就像我做的一样,或者重新分配每个纹理。 如果没有这样的选项,我必须改变我的工作stream程,以防其他人需要使用我的文件,并将所有文件保存在同一个文件夹中? 什么是正常的程序,以保持每个用户的组织和兼容的一切?

如何从某个角度查看我的数据时,如何解决这个透明度问题?

using Microsoft.DirectX.Direct3D; using Microsoft.DirectX; 我通过设置device.RenderState.AlphaBlendEnable = true渲染3D数据 现在我的顶视图看起来像下面,外表层覆盖下面的图层,结果只有外层显示在顶视图。 我想从顶视图中查看底层。 我该怎么做呢? 是否有任何设置可以使用Microsoft.DirectX ? 更新:问题由我自己解决 device.RenderState.ZBufferWriteEnable = false;

绘制透明和不透明的3D对象。 我如何防止z战斗?

我正在使用透明的加权平均algorithm来绘制我的透明对象。 透明对象用以下显着渲染状态绘制(其余为默认的XNA值): CustomBlendState.Additive, DepthStencilState.DepthRead, RasterizerState.CullNone, SamplerState.PointClamp 不透明物体使用以下状态绘制: BlendState.Opaque; DepthStencilState.Default; RasterizerState.CullCounterClockwise; SamplerState.PointClamp; 在下面的图片中,我认为是绿色块和木块相遇的z战斗问题。 我怎样才能保持在同一地点的对象,并阻止这个问题的发生? 将透明对象的DepthStencilState.DepthRead状态更改为DepthStencilState.None时,问题就消失了。 虽然这使我相信这是一个z战斗的问题,不透明的对象将不再遮蔽从另一个角度来看透明物体。 编辑: 对情况施加深度偏差也没有明显的差别: public static RasterizerState SolidNoCullBias = new RasterizerState() { CullMode = CullMode.None, FillMode = FillMode.Solid, DepthBias = 1f, SlopeScaleDepthBias = 1f, }; 编辑2: 剔除三角形将导致对象看起来不正确,因为透明对象应显示内部和外部面。 编辑3: Depth Stencil状态如下与'LessEqual'比较函数(不解决问题)

用四元数正确旋转

我有一个旋转大理石的问题。 我已经用Matrix.CreateFromYawPitchRoll和Matrix.CreateRotation尝试过了,但是有一些问题,我认为这是由于Gimbal锁效应。 所以,我尝试使用四元数 ,而没有改变。 当只在一个轴上移动时,它可以正常工作,但是当旋转发生在两个不同的轴上时,大理石依然在错误的轴上旋转。 这是我的代码: // declarations Vector3 Position = Vector3.Zero; Vector3 Rotation = Vector3.Zero; Quaternion qRotation = Quaternion.Identity; AbsoluteBoneTransforms = new Matrix[Model.Bones.Count]; Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms); 在Update方法中: Position += speed; Rotation = speed * MathHelper.ToRadians(-1.5f); Quaternion rot = Quaternion.CreateFromAxisAngle(Vector3.Right, Rotation.Z) * Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation.X); qRotation *= rot; 在Draw方法中: effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position); 怎么了? 编辑 […]

第一人称相机在角度扫射

我有一个简单的相机类在DirectX 11中工作,允许前进和左右旋转。 我试图实施扫射,但有一些问题。 当没有相机旋转时,扫射工作,所以当相机开始在0,0,0。但是,在任何一个方向旋转相机后,似乎在一个角度或倒置或只是一些奇怪的东西strafe。 这是一个上传到Dropbox的video,显示了这种行为。 https://dl.dropboxusercontent.com/u/287​​3587/IncorrectStrafing.mp4 这是我的相机课。 我有一个预感,这是相关的相机位置的计算。 我尝试了各种不同的计算方法,他们似乎都遵循相同的模式和相同的行为。 另外m_camera_rotation代表Y旋转,因为投球还没有实现。 #include "camera.h" camera::camera(float x, float y, float z, float initial_rotation) { m_x = x; m_y = y; m_z = z; m_camera_rotation = initial_rotation; updateDXZ(); } camera::~camera(void) { } void camera::updateDXZ() { m_dx = sin(m_camera_rotation * (XM_PI/180.0)); m_dz = cos(m_camera_rotation * (XM_PI/180.0)); } void camera::Rotate(float amount) […]

用3D帆布球replace一个div(带有球形图片)

我想制作一个游戏,你必须把球保持在一个绿色的平台上。 在这一点上,球是一个球的形象。 你可以在球场上移动球,一切都很好。 在这里看到它(首先点击1)。 当你使用箭头键,你可以移动球(实际上你移动一个div )。 这看起来有点假,所以我想用一个真正的3D帆布球。 我在这里看到一个很好的例子。 (向下滚动到页面的一半,在标题上方会看到一个带有球的笑脸:平滑) 那么我怎么能用这个球进入我的比赛? 我有以下代码的球: // build the ball and draw its texture with a 2d canvas ——————————————- var buildBall = function() { // create a canvas to draw the ball's texture var ballCanvas = document.createElement('canvas'); ballCanvas.width = 64; ballCanvas.height = 64; var ballContext = ballCanvas.getContext('2d'); // draw 2 […]

不可见时绘制角色轮廓

我有一个网格代表我的性格。 当其他物体从相机的视野中阻挡时,我想给它一个部分透明的灰色轮廓。 我使用Ogre3D和GLSL作为着色语言,但这是一个相当技术/语言不可知论的问题。

HLSL着色器(效果)中的SetFloat()不起作用 – variables停留在0

我有一个问题,我想在我的着色器中设置两个简单的浮点variables。 我在这个项目中有十几个其他着色器,但是由于某种原因,我在这个项目中有一个我不能发现的bug。 这是我正在做的事情。 为了简洁起见,我会对其进行编辑,但请尽量保持完整。 任何建议都非常欢迎! 首先,将video的宽度和高度存储在表示着色器的类中,然后调用设置variables的函数。 _hVideoWidth = _ptrEffect->GetParameterByName(0, "videoWidth"); _hVideoHeight = _ptrEffect->GetParameterByName(0, "videoHeight"); pShader->_videoWidth = pCameraManager->_backBufferWidth; pShader->_videoHeight = pCameraManager->_backBufferHeight; pShader->SetActive(); _ptrEffect->SetFloat(_hVideoWidth, _videoWidth); _ptrEffect->SetFloat(_hVideoHeight, _videoHeight); 然后我做我的绘画: UINT cPasses; pShader->GetEffect()->Begin(&cPasses, 0); // Drawing code here pShader->GetEffect()->End(); 我的着色器将使用videoHeight / Width来缩放到视口。 如果我硬编码的宽度和高度,这一切都完美的作品。 cbuffer VideoData : register(b0) { float videoWidth; float videoHeight; } VertexShaderOutput UILineVertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; […]